轉自我的BLOG http://blog.csdn.net/goldenhawking/article/details/6402775
最近經過陛下點撥,涉獵了“OpenStreetMap”,做了不少業余研究,把成果給大家分享一下,特別是提供搭建好的客戶端-服務器框架,以及中國國內的OSM開放地圖范例。
為什么只有中國的??
原因很簡單, 由於導入世界范圍數據要耗費 100GB以上的磁盤。經過我親自測試,如果需要導入世界數據的話,在擁有4GB存儲器、1TB磁盤陣列的HP 8核服務器上需要近1周的時間(PostgreSQL Shared-Mem 128MB, Work Mem 512MB, Maintain 512MB),且虛擬機與 PostgreSQL服務器並不在同一機器。(數據庫服務器要求專用,才能發揮最好效果) 。
盡管提供的僅是導入中國國內數據的范例服務器, 但是您可以從網站下載完整鏡像(2011年4月的約16GB),而后導入本范例的服務器,即可立刻擁有世界范圍的數據訪問。在導入之前請詳細閱讀光盤中的文檔,特別是
1、確保PostgreSQL 的資源充分
2、確保導入期間PostgreSQL 的"autovacuum" 已經關閉。
3、確保不要斷電
我創建的完整范例鏡像鏈接(盡量保持開機上傳,請大家有耐心!虛擬機所有口令全部是 1234567, 包括開機和數據庫管理員。數據庫渲染用戶osmrender,口令osmrender):
ed2k://|file|Planet.OSM_Server_and_Client_by_goldenhawking(OSM%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E8%8C%83%E4%BE%8B%E5%AE%A2%E6%88%B7%E7%AB%AF).iso|4132896768|F6F5774B8E2FD4032F997523FB7BC097|h=PNZKU5WEIGMUUCOQSLFE2EOWMZCXORAL|/
說明和截圖:
ed2k://|file|Planet.OSM_Server_and_Client_by_goldenhawking(OSM%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E8%8C%83%E4%BE%8B%E5%AE%A2%E6%88%B7%E7%AB%AF).iso.%E8%AF%B4%E6%98%8E%E5%92%8C%E6%88%AA%E5%9B%BE.rar|619839|32DD6E70287DFEE35E77F77DACF23EEB|h=QBAQ6QZNPOBDP4KL2ZGMD2L5ST5C44LP|/
Planet.OSM( Open Street Map) 計划是開放源代碼的GIS應用,目前經過全世界熱心同仁的更新,其底層數據的質量明顯提升,精度、數據量均不是小打小敲的商業地圖應用可比擬的(比GoogleMap等還是要朴素)。其地圖通過網址 http://www.openstreetmap.org 可以直觀訪問。不僅如此,如果能夠接入Internet, 可以方便的使用其API,支持包括移動設備在內的多種服務。
http://wiki.openstreetmap.org/wiki/Planet.osm 介紹了她的詳細情況。這次,我們要討論的是在公司內部的專用網路上,如何搭建像模像樣的 OSM 服務器。適用的范圍:
1、公司內部網絡限制了上網,但又需要GIS應用的地方
2、需要訂制 GIS 應用的地方
3、需要攜帶到邊遠地區的便攜式計算機上的情況。
由於是輕量級的應用,我不實現完整的API, 只是注重顯示、運用地圖本身作為底圖。
1、osm 體系一分鍾介紹
在開始之前,有必要介紹一下OSM的體系。(看過英文資料 http://wiki.openstreetmap.org/wiki/Planet.osm的可以略過)。OSMGIS 的底層數據由點、線、面等基本圖元構成,這些含有屬性(地名等)的幾何元素以 XML 格式定期在網站發布:
ftp://ftp.spline.de/pub/openstreetmap/
這些XML格式的圖元來自工具"osmosis"導出PostgreSQL數據庫的鏡像, 這個工具的說明見:
http://wiki.openstreetmap.org/wiki/Osmosis
PostgreSQL數據庫中的圖元對象在 PostGIS的支持下形成供世界各地用戶不斷完善的數據集。然而,數據本身都是字符串格式的,無法直接進行顯示。為此,有不少中間件(渲染引擎)被設計出來,用於把數據庫中的字符圖元變成可以瀏覽的圖像,其中最著名的就是 Mapnik。 本次,我們采用Ubuntu上的Mapnik作為渲染引擎。 Mapnik 本身是一個C++庫,通過綁定在Python上,提供了簡便的接口,只要給出生成圖像的比例尺、范圍,即可生成png,jpg,gif等格式的圖像。
2、投影系
OSM 與 Google-Map 同樣采用摩卡托(http://en.wikipedia.org/wiki/Mercator_projection)投影系,這種投影是保角投影,南北極附近是奇異點,無法顯示,也算是他的一大缺陷了。第0級比例尺全世界地圖被承載在 256 * 256 大小的圖片上,第1級比例尺為 512*512, 分為 兩行、兩列256*256的圖片。第2級比例尺為 1024*1024,即4*4=16個256*256的圖片...以此類推, 每一級擁有 2^n 行, 2^n 列個瓦片組成,左上角編號為0,0,右下角為 2^n-1,2^n-1. 具體編號參見更多資料。
3、詳細搭建方法
老外已經寫得不能再詳細了,見http://weait.com/content/build-your-own-openstreetmap-server, 直接按照他說的做,准OK!
4、網頁服務與客戶端程序
客戶端有很多實現方法,這里給出的是 Windows 下的 VC++ 2008/2010的工程。原理很簡單,通過讀取特定比例尺下的瓦片,在屏幕上拼接顯示。對沒有渲染的瓦片,登記入數據庫,由渲染程序生成。范例中演示的比較簡單,希望起到拋磚引玉的效果!
注意: 所有口令都是1234567,確保VMWare 共享文件夾可用!光盤中附帶了VM軟件!界面:
http://bbs.csdn.net/topics/370157384