學(xué)了幾天mapnik

因?yàn)楣ぷ餍枰?,要把路況信息做成切片,因?yàn)橹澳欠N方式(直接繪制路況)效果不大好,繪制速度太慢,也太過于消耗流量了(一次就把整個(gè)市的路況信息都返回來了)。四月十三號開始接到這個(gè)任務(wù),并著手查找關(guān)于切片的資料。
  最開始,主任的想法是通過算法實(shí)現(xiàn),很顯然要用到裁剪算法。但這個(gè)方式我并不贊同,且不說裁剪算法用于此次多么復(fù)雜,而且還要考慮到效率問題,polyline排序本來就非常的復(fù)雜而且來回遍歷也是很費(fèi)事的。主任同意我使用一些現(xiàn)成的切片庫,這樣可以節(jié)省很多精力。

  • 首先想到的arcgis engine二次開發(fā),但不久就放棄了。網(wǎng)上找到一些切片demo,好像是必須要安裝arcgis server,那么就真的麻煩了。而且還要安裝arcgis runtime,以及授權(quán)許可,簡直麻煩到家了。
  • 然后想到第三方開源軟件geoserver,這個(gè)可以實(shí)現(xiàn)切片,通過二次開發(fā)的話應(yīng)該也是沒問題的。但這方面的資料好少啊,簡直無從下手。
  • 使用gdal工具gdal2tiles.py,這個(gè)看起來不錯,可以實(shí)現(xiàn)切片功能。需要配置gdal環(huán)境,不知怎么得就放棄了這個(gè)。
  • 是看到了mapnik,才放棄了gdal2tiles.py,也許是后者資料太少吧。mapnik也是需要安裝的,可以選擇三種語言來開發(fā)——python、nodejs以及c++??紤]的效率問題,我最開始打算使用c++,要求版本好像挺高的,需要c++11;之后就想用nodejs,很早就像用nodejs實(shí)戰(zhàn)一下,何況對于ajax請求以及json解析也是存在優(yōu)勢的,最后也不得不放棄了,因?yàn)楣俜椒懦龅馁Y料太少了,連一個(gè)demo都不給我。不得不選用python了,也不錯,頭一次使用python寫程序,還有些小激動呢!
      雖然是第一次使用python,但開發(fā)起來效率還是比較高的,分為以下步驟:
  1. 讀取本地測試數(shù)據(jù)json,并解析
      中間出現(xiàn)過字符編碼問題,糾結(jié)過一段時(shí)間。
  2. 生成shapefile文件
      同樣利用第三方庫pyshp.
  3. 利用網(wǎng)上開源代碼generate_tiles.py,實(shí)現(xiàn)多級別切片
      不幸呀!出現(xiàn)了重疊部分,糾結(jié)了整整一天。有可能是地圖投影是出現(xiàn)了問題,當(dāng)我設(shè)置m.aspect_fix_mode屬性是沒有出現(xiàn)效果
  4. 利用NSIS封裝打包
      由于第三步出現(xiàn)了故障,打包推遲。
      老楊給出了比較好的解決方案,直接通過行列號反算經(jīng)緯度,實(shí)現(xiàn)bbox范圍的確定,解決了切面重疊問題。老楊很聰明,這一方面也不得不服。那么問題來了,路況信息5分鐘刷新一次,切片也要在五分鐘內(nèi)完成吧。然而事實(shí)上很殘酷,畢竟是到20級呀,一套下來4700秒,接近80分鐘。顯然不合理,20級地圖占用了太多的時(shí)間,理論上是更高一級是低一級耗時(shí)的四倍,也就是說僅20級就用了一個(gè)小時(shí)。假使服務(wù)器cpu是32個(gè)核,都占用起來應(yīng)該會縮短到五分鐘以內(nèi),但想想機(jī)房里cpu瘋狂般的不停高負(fù)荷運(yùn)轉(zhuǎn)也是夠了。也許使用geojson,借助前端地圖渲染引擎來支持或許是個(gè)好辦法。
計(jì)時(shí)單位:毫秒
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容