2011年8月22日 星期一

Android小品_Ola Query and Ola Event View

經過之前所測試的田野調查小程式,與之前耍寶拍了一個介紹利用ESRI GIS Server For Android API製作的看圖小程式影片,這個假日決定再擴大這一個架構,整個規劃出來的架構如下圖:

整體架構分為三個部分:
一、外業由行動化裝置傳遞文字、照片、標記與照片等資訊到伺服器。
二、內業則依照各項上傳資訊利用'事件檢視網頁'進行各項資訊的瀏覽,並可增加其餘相關資訊或檔案。
三、其他外業裝置藉由WebService的方式,瀏覽第一部分與第二部分之資訊。

整個架構需要的技術分為四部份:
一、行動化裝置資訊上傳:Android、接gps資訊、SQLite、ESRI GIS Server API、文字檔案上傳伺服器。
二、伺服器相關:Web Service、SQL、SQL Spatial。
三、檢視資訊網頁:ASP.NET、Google Map API、jQuery。
四、行動化裝置資訊下載:Android、接Web Service、bmp resample。

來看成果:
1. 外業查報-地圖檢視

2. 外業查報-屬性查詢(圖查文)

3. 外業查報-屬性查詢(文查圖)

4. 外業查報-地圖標記

5. 外業查報-資訊填報

6. 外業查報-拍照與上傳

7. 事件檢視網頁-事件查看(文字、照片、地圖標記、位置[以google map呈現])

8. 行動化裝置檢視資訊-事件列表

9. 行動化裝置檢視資訊-線程處理

10. 行動化裝置檢視資訊-詳細資訊查看(文字、位置、標記與照片)


目前架構還有許多許多的缺憾,也帶隨著很多很多的bug,希望下一次更完善的規劃不要離這篇太遠。

ㄠ嗚~~~~~

2011年8月18日 星期四

Android學習_SimpleAdapter的使用

有很多時候,我們只需要顯示一類資料,或是說只是單純的顯示一個Array(例如:縣市名稱),那我們可以用前篇的ArrayAdapte很快速的達成,但是有更多的時候我們的資料可能是一張表(一筆資料裡面有多個欄位),那這個時候ArrayAdapte可能就會使不上力,我們需要的是另一個繼承於BaseAdapter的SimpleAdapter。

去觀察他所需要傳入的變數,可以發現有一個很奇妙的型別"List<?extends Map<String,?>>"。

所以在使用之前,我們要先將資料建立成該型態,才能正確地顯示出來。
由上圖的說明,可以瞭解傳入的參數必須是一個list<>內帶著Map<String,?>,首先看看Map這一個介面(官方說明)

Map<k,v>前面的k代表者key,後面的v代表著value,而Map附帶著put的方法,可供我們將資料塞入;所以如果以一張表來想,一個Map就代表著一筆資料、每put一次就代表增加一個欄位,接著我們再將資料add進List。
程式碼如下:

List<Map<String,String>> value=new ArrayList<Map<String,String>>();
for(int i = 0;i < result.length(); i++)
{
Map<String,String> item1=new HashMap<String,String>();
item1.put("ThingTitle",ThingTitle);
item1.put("ThingContent",ThingContent);
item1.put("LinkID",LinkID);
item1.put("RTime",RTime);
value.add(item1);
}

內容為建立了一個List叫做value,一個Map叫做item1;將我們所獲得的資料一欄一欄的藉由put方法加進item1內,並用add方法將一整份Map加入value這個List內,來完成資料的轉換。

有了資料來源以後,就可以正式開始資料放入的動作。
步驟:
1. 取得List<?extends Map<String,?>>型態的資料來源(如上面步驟)

2. 建立一個自定義的layout,放入四項資訊。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<CheckedTextView android:id="@+id/listTextView1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="2px"
android:layout_height="2px"
android:textColor="@drawable/green"
android:visibility="invisible"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView2"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/green"
android:textSize="50px"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView3"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/gray"
android:textSize="30px"
>
</CheckedTextView>

<CheckedTextView android:id="@+id/listTextView4"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/gray"
android:layout_marginRight="10px"
android:textSize="20px"
>
</CheckedTextView>

</LinearLayout>
</LinearLayout>

3. 確定resource、from與to參數

再看一次需要的參數,還有第三、四、五個不太清楚:
第三個(resource):自定義的layout id
第四個(from):依照key值,指定由第二個參數來的顯示順序
第五個(to):指定from內的各項目要放置到的R.id(EX:R.id.listTextView1)

String[] ContentItem = new String[] { "LinkID","ThingTitle", "ThingContent","RTime" };
int[] TextViewID = new int[] { R.id.listTextView1,R.id.listTextView2,R.id.listTextView3,R.id.listTextView4};
SimpleAdapter simpleAdapter = new SimpleAdapter(this,value,R.layout.object_list,ContentItem,TextViewID);
Olalist.setAdapter(simpleAdapter);

執行結果:


所以不管我們用任何方法取得到的表格資料,都可以藉由上面的順序,顯示成我們想要的列表方式。

Android學習_ArrayAdapter的使用

經過剛剛聽到的對話,我決定關閉我的VS2010開啟Eclipse來記錄一下那些深怕忘記的內容。

在許多mobile程式中,常常會看到排列整齊的選單,有可能是接收RSS或WebService之後的列表,或是提供使用者選擇所需項目,而這類方便的介面許多時候更是貫串整個APP的重要功臣,例如我們常常會打開的設定列表等等。

在Android當中,要做出列表般的效果,都會藉由android.widget.Adapter的相關子類別來實現,而在很多的應用當中,其中有一種"單純只想把一類項目列出來",這時可以利用ArrayAdapter達成。

整個事情要完成只有3個步驟:
1. 在layout裡面放一個ListView。

<ListView android:id="@+id/listview1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

2. 將ListView實體化

ListView Olalist = (ListView) this.findViewById(R.id.listview1);

3. 於要放置列表的事件中執行setAdapter。

String[] item = new String[] {"Ola的家", "魔獸世界","星海爭霸2","凱蘭迪亞傳奇","Ola Query簡介","蟲族秒滅心法","Ola MapGuide教學","Ola jQuery教學","Ola Android教學"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,item);
Olalist.setAdapter(adapter);

上方程式碼有兩個重點:
A. ArrayAdapte所接收之項目為Array,之所以前面說「"單純只想把一類項目列出來"」的原因也在這裡,ArrayAdapte的方法裡面並沒有提供多欄位的顯示方式。
B. 在第二個參數中使用"android.R.layout.simple_expandable_list_item_1",表示是用Android內建的配置。
執行結果:


單一項目是屬於ArrayAdapte的限制,但去看ArrayAdapter的說明,可以發現他也可以使用我們自己定義的配置檔;若是使用自己的配置檔(layout),那麼就必須去指定要擺放文字的textViewResourceId。
自訂的Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<ImageView
android:id="@+id/ImageView_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10px"
android:src="@drawable/main_new"
/>

<CheckedTextView android:id="@+id/listTextView1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/green"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView2"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/green"
android:text="-----自訂"
>
</CheckedTextView>
</LinearLayout>

也就是前面擺放一張固定的圖,在顯示的內容後面加上"-----自訂"文字。
綁定的程式碼:

String[] item = new String[] {"Ola的家", "魔獸世界","星海爭霸2","凱蘭迪亞傳奇","Ola Query簡介","蟲族秒滅心法","Ola MapGuide教學","Ola jQuery教學","Ola Android教學"};
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.sample_list,R.id.listTextView1,item);
Olalist.setAdapter(adapter);

執行結果:

如果看到上面的內容,想到的事情應該是:
A. 圖片可以依照項目不同嗎?
B. 第二個文字可以也直接用帶入的嗎?

答案是當然可以,但是使用ArrayAdapter可能不是最佳選擇,因為他一次綁定的數據為一個Array,對於其他內容的顯示可能就不是這麼方便,可是一切都還是可以藉由改寫的方式完成。

2011年8月11日 星期四

如何利用AutoCAD Map將SDF2轉SDF3

大家都知道MapGuide6.5時代(我沒經歷),所使用的SDF版本為2.X版,而到了MapGuide Enterprise則開始使用SDF3這個版本,其中最大的差別在於SDF2只能指定三個欄位:Url、Name及Key,所以以往的做法是"一定"要將相關資料儲存在資料庫中,而把可以識別唯一性的資訊儲存在這三個欄位中。(概念上是這樣,但是我沒有實際操作過)

又因為在台灣MapGuide6.5相當風行,在以往系統不是ArcIMS就是MapGuide6.5,所以遇到有舊系統的單位,就很有可能拿到SDF2的格式。

那如果恰巧你又是AutoCAD Map的使用者,就會發現Map的FDO資料關聯是沒辦法關聯SDF2的版本,所以當我們拿到SDF2的資料,又拿到後面相關欄位的資料表,我們就會很希望把SDF2轉成SDF3,並且將Url、Name及Key三個欄位的屬性資料都帶進轉的SDF3檔案中。

在找資料的過程中,有一些文章說可以利用MapGuide Studio API來進行轉檔,但是我找不到操作的方法,所以最後是使用AutoCAD Map 2010來進行的。(說也奇怪我沒有找到有人教怎麼用AutoCAD Map來轉,不得不說Autodesk的學習資源真的很少,不像某E公司)

轉檔步驟:
1. 打開AutoCAD Map 2010,並且選到"插入"tab。

2. 點選"匯入"方塊中的SDF2按鈕,選擇你要轉的檔案。

3. 選擇你要將檔案匯入的圖層(如果只是單純轉檔,隨便選一層空的就可以了),接著將"指定給物件表格"打勾,並且點擊旁邊的表格圖示。

4. 輸入一個表格名稱,並在欄位名稱分別輸入Name、Url與Key,然後將其加入。

5. 確認所輸入的Name、Url與Key分別對應到正確的位置,確認後點擊確定。

6. 匯入完成後,可以觀察下方指令視窗是否有插入物件,這時候你的螢幕可能還是灰灰一片沒有圖徵,你可以利用Z→E的快捷來Zoom到圖徵位置。

7. 接著做一個確認動作,點選隨便一個圖徵,按右鍵選擇"性質"(在最下面)

8. 你可以看到出來的性質表格最後,有你剛剛定義的表格名稱,並且帶著三個屬性。

9. 接著選取上方"輸出"tab,點擊匯出區塊的"匯出為SDF"。

10. 選取你要匯出的層(也就是剛剛匯入的那層),並點擊"圖徵類別"tab。

11. 選取"根據圖面物件建立多個類別"(就可以看到剛剛建立的表格被帶出來),選擇匯出層的幾何圖形,並且按下確定。

12. 匯出完成以後,可以利用資料連接的方式讀入剛剛的檔案,並且利用平常觀看SDF3屬性的方式來操作了。

如果你因為這篇而成功轉檔成功,請留"YES,轉成功了"。

2011年8月4日 星期四

MpaGuide管理介面於server2008(CGI錯誤)

MapGuide管理介面是以php撰寫的,所以在安裝IIS7時,必須於"應用程式開發"勾選"CGI"子項目。

那如果IIS安裝時忘記勾選,該怎麼新增上去呢?

1. 到伺服器管理介面。
2. 選擇"網頁伺服器(IIS)"
3. 移至"角色服務",點選右邊"新增角色服務"。

4. 你就可以看到管理介面囉。

Win7(64bit) +AutoCad Map 3D 2010 + Oracle Client問題

最近公司將所有電腦都轉成Windows7(64bit),所以首要工作就是將之前在使用的每一套軟體恢復正常,就在一切都相當順利的時候,發現原本在使用的Oracle client11.1在安裝時會出現作業系統不符合的警訊,網路上搜尋以後發現可以勾選忽略後繼續安裝,安裝完成後也的確可以正常使用,利用VS2010(32bit)測試,也很爭氣地就連上的Oracle 11g。

但是除了開發工具需要連上外,另一個更重要的事情是"AutoCad Map 3D"也必須要可以連上,才可以方便的利用該軟體將空間資料匯到Oracle Spatial當中,而部門現在安裝的AutoCad Map 3D版本為2010(64bit),一按:

AutoCad Map 3D 2010(64bit)就會以迅雷不及掩耳的速度跳出「指定的憑證無效或Provider無法建立連結」,那種感覺就像程式根本沒有去連,而是出了其他的問題,但是被統一歸類了。

如果以Win7、AutoCad Map 3D、Oracle這三個關鍵字,怎麼組合怎麼查都沒辦法看到甚麼完全命中的文章,只有一個相關的問題:Map 3D / MapGuide 连接 Oracle 找不到oci.dll?,但是我並沒有發生。

總之,最後又在一陣亂找之後,才想起來在灌Oracle client時候出現的警訊,往這方向找後才發現Oracle client出了11.2版了,而且是給win7 64bit,就在半信半疑的狀況下,還是移除了11.1灌了新下載的11.2,一連!噹噹!順利連上,也順便測試了資料匯入,也順利匯入了。

但是,VS2010變成不能連了。XD

*記載一下Oracle client要去哪裡下載?
1. 連上Oracle網站。
2. 移到Download,選Database 11g。
3. 找你要的版本,點See All。(位置)

2011年8月1日 星期一

火源之界-RC語音的威能

星期六早上九點半一如往常的打電話、組人、出發,來到副本門口,按下發聲鍵,「有聽到嗎?骰一下SEED!」,團隊頻道一陣寂靜,阿龍準時的問:「要骰SEED嗎?」....心中突然浮現一個不好的預感→該不會語音壞掉了吧?

經過反覆測試,一直測到貝絲緹拉克前面,麥克風還是很不爭氣的一點聲音都沒有,所以整個早上就在沒人講笑話(?)的安靜氣氛下倒了守門人。

「我在測一下語音,如果下午沒有好,那我想.....就.....放假了,一點集合。」

總之,從11點50測到1點5分,不管是換麥克風、換電腦、重開機都還是一點用都沒有,最後決定嘗試辰藍講兩個星期但是我都忘記裝的RC語音,因為桌機似乎有點問題,所以把RC語音裝到NB上面,NB的電源線從我的左邊繞到床上,麥克風線又從我的右邊繞到鍵盤旁邊,安裝完成以後,我整個就呈現一種沒辦法動彈的狀態;但這都不是重點,重要的是團隊頻道看到「有!很清楚」的字眼,NB的喇叭也傳來其他人的語音,當時心中只有一種「YES!」的感覺。(但沒想到這個YES延續很久)

首先來到萊爾利斯領主,傳說中的左右腳,前兩個星期一次花了1個半小時,一次花了2個半小時才繼續推進,心中不禁有點擔心今天不知道要跟他玩幾次。
「好!準備,ㄟㄟ...那是誰引到,上了上了。」
開場後8-10秒,王大腳一踩,左邊一個死火山,右邊兩個,「右轉右轉」,
說時遲那時快,王立刻踩掉腳邊的死火山,並且點了左邊的變活火山,「喔!不!」
「不管,持續右轉過去」就在王持續右轉,他又立刻點了左手的火山,
「ㄜ.....連續錯過兩個」
領主先生也豪不客氣的又舉起了大腳準備踩下去,碰的一聲....
怪怪,10個人都在站著...
就這樣氣勢突然回到我們這邊,在連續踩中9個活火山以後,王變成溶炎人倒在地上。
第一次倒王的合照

帶著一次倒左右腳的興奮心情,想說今天可以好好的拓一下鳳凰,讓大家更熟悉P2炫風的跑位;因為之前已經有兩次經驗,這次大家在炫風的存活率就提高很多,但是對於這種死一個就很難撐下去的王,要湊齊大家剛好同一次都沒死也是漫困難的。
就在一個吃了三根羽毛還莫名在P2死亡的法師又死了以後,NB傳來「要拉嗎?」,「拉一下好了,這樣可以練習時間長一點」,這一長還真的是不得了的長,首次進入第三輪的P1,「這個P1撐過就過了」,就在大家很幫忙的幫一個DPS殘弱的戰士打掉雛鳥,又很爭氣的全員跑過龍捲風,王掉了下來,然後也沒有再起來。

「要去看鹿盔嗎?」
「看一下好了,先熟悉一下,這樣下次拓會比較快進入狀況」
來到鹿盔的前面,有著KAKA、阿龍、大熊的經驗,很快的我們得到了一個數字很混亂的戰術,
A戰術:8→6→8→5→4→3→不是他死就是我死
B戰術:10→6→6→5→4→3→不是他死就是我死
經過了很多"我們死以後",有人問「今天要打到幾點呀?」
看看時鐘,已經來到了下午4點45,「再練習兩次好了」
好,一如往常的,秒滅。
「那最後一次,但是要注意的要注意,我會先提醒」
最終戰術:
1. 蝎子10(3開英勇、7-8開璧、9開精通、10開DK盾)
2. 豹5
3. 蝎子7(6開精通、7開DK盾)→跑點名爆炸
4. 豹5
5. 蝎子6(3-4開璧、5開精通、6開DK盾)
6. 豹4 →吃火球
7. 蝎....不是你死就是我死。
最後來到第6階段,損員兩個,進到第七階段,王剩200萬,每次能量滿砍下去都是心驚膽跳,
最後就在「阿烏~~~~~」畫下句點。
NB傳來「這太扯了」「喔,天呀」,真的是心臟都要跳出來。

最後,當然要去跟尾王"拉格納羅斯"合照,就在合照的10秒後,有人開了王,以大家逃進傳送門收場。


大家真是太威了!難道是因為聽到我的語音。 >//////<
飛魚不要在結婚囉,喔...不是,飛魚的親戚不要再結婚囉。

後記:
左右腳第一次倒,「先合照,下次不知道什麼時候倒」
鳳凰倒了,「先合照,下次不知道什麼時候倒」
鹿盔倒了,「先合照,下次不知道什麼時候倒」