摘要
HT for Web作為邏輯拓?fù)鋱D形組件自身沒有GIS功能,但可以與各種GIS引擎即其客戶端組件進(jìn)行融合,各取所長實(shí)現(xiàn)邏輯拓?fù)浜臀锢硗負(fù)涞臒o縫融合,本章將具體介紹HT for Web與開發(fā)免費(fèi)的OpenLayers地圖結(jié)合應(yīng)用的關(guān)鍵技術(shù)點(diǎn),該文介紹的結(jié)合的原理,其實(shí)還可推廣到與ArcGIS、百度地圖以及GoogleMap等眾多GIS地圖引擎融合的解決方案。
HT for Web作為邏輯拓?fù)鋱D形組件自身沒有GIS功能,但可以與各種GIS引擎即其客戶端組件進(jìn)行融合,各取所長實(shí)現(xiàn)邏輯拓?fù)浜臀锢硗負(fù)涞臒o縫融合,本章將具體介紹HT for Web與開發(fā)免費(fèi)的OpenLayers地圖結(jié)合應(yīng)用的關(guān)鍵技術(shù)點(diǎn),該文介紹的結(jié)合的原理,其實(shí)還可推廣到與ArcGIS、百度地圖以及GoogleMap等眾多GIS地圖引擎融合的解決方案。 以上抓圖為本文介紹的例子最終運(yùn)行效果,接下來我們一步步來實(shí)現(xiàn),首選顯示地圖信息需要有城市經(jīng)緯度數(shù)據(jù),搜索了下感謝此篇博客提供的數(shù)據(jù)。這么大量的數(shù)據(jù)我采用的是《HT圖形組件設(shè)計(jì)之道(四)》中介紹的getRawText函數(shù)方式,有了數(shù)據(jù)之后剩下就是呈現(xiàn)的問題了,我們需要將HT的GraphView組件與OpenLayers的map地圖組件疊加在一起,也就是OpenLayers的tile地圖圖片在下方,GraphView的組件在上方,由于GraphView默認(rèn)是透明的,因此非圖元部分用戶可穿透看到地圖內(nèi)容。找到合適的組件插入位置是頭疼的事情,ArcGIS、百度地圖包括GoogleMap幾乎每個(gè)不同的GIS組件都需要嘗試一番才能找到合適的插入位置,其他GIS引擎組件的整合以后章節(jié)再介紹,本文我們關(guān)注的OpenLayers的插入方式為map.viewPortDiv.appendChild(graphView.getView())。 HT和OpenLayers組件疊加在一起之后,剩下就是拓?fù)淅锩鎴D元的擺放位置與經(jīng)緯度結(jié)合的問題,常規(guī)網(wǎng)絡(luò)拓?fù)鋱D中存儲(chǔ)在ht.Node圖元的position是邏輯位置,和經(jīng)緯度沒有任何關(guān)系,因此在GIS應(yīng)用中我們需要根據(jù)圖元的經(jīng)緯度信息換算出position的屏幕邏輯坐標(biāo)信息,如果你知道投影算法也可以自己提供函數(shù)處理,但所有GIS組件都提供了類似的API函數(shù)供調(diào)用,當(dāng)然這部分也沒有標(biāo)準(zhǔn)化,不同的GIS組件需要調(diào)用的API都有差異,但基本原理是一致的,對(duì)于OpenLayers我們通過map.getPixelFromLonLat(data.lonLat)可以將經(jīng)緯度信息轉(zhuǎn)換成屏幕像素邏輯坐標(biāo),也就是ht.Node需要的position坐標(biāo)信息。 細(xì)心的同學(xué)會(huì)想到轉(zhuǎn)換是雙向的,有可能用戶需要拖動(dòng)圖元節(jié)點(diǎn)改變其經(jīng)緯度信息,這時(shí)候我們就需要另外一個(gè)方向函數(shù),即根據(jù)屏幕邏輯坐標(biāo)轉(zhuǎn)換成當(dāng)前坐標(biāo)對(duì)應(yīng)的經(jīng)緯度,在OpenLayers中我們通過map.getLonLatFromPixel(new OpenLayers.Pixel(x, y));可以搞定。 顯示搞定后剩下就是交互的問題了,HT自己有套交互體系,OpenLayers也需要地圖漫游和縮放的交互,兩者如何結(jié)合呢?如果能保留住兩者的功能那就最好了,答案時(shí)肯定的,我們只需要添加mousedown或touchstart事件監(jiān)聽,如果graphView.getDataAt(e)選中了圖元我們就通過e.stopPropagation();停止事件的傳播,這樣map地圖就不會(huì)響應(yīng),這時(shí)候HT接管了交互,如果沒有選中圖元?jiǎng)tmap接管地圖操作的交互。 以上交互設(shè)計(jì)似乎很完美了,結(jié)果運(yùn)行時(shí)發(fā)現(xiàn)了幾處折騰了我很久才找到解決方案的坑:
為了讓這個(gè)例子用戶體驗(yàn)更友好,我還用心折騰了些技術(shù)點(diǎn)供參考:
以下為最終效果的抓圖、視頻和源代碼:http://v.youku.com/v_show/id_XODM5Njk0NTU2.html
|
|