




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、OpenLayers 中的球面墨卡托投影最近看 OpenLayers,研究到地圖投影時找到官方的文檔,就翻譯了一下,由于英文能力差,翻譯不好的地方,請看原文原文地址:/library/sphericalmercator.html球面墨卡托投影該文檔說明了什么是球面墨卡托投影以及何時使用該投影。文檔中包含一些必要的背景知識、商用圖層的代碼演示、添加 WMS圖層以及使用 OpenLayers 進行投影變換的內容。要求讀者對投影變換和 OpenLayers 有一個基本的了解。什么是球面墨卡托投影?球面墨卡托投影在 OpenLayerscommunit
2、y 版本和其他 OSGcommunity 版本中都有使用。GoogleMaps,微軟VirtualEarth,YahooMaps 和其他商業地圖 API 的提供者都使用該投影。該投影是將地球當作一個球體而不是橢球體,然后應用墨卡托投影的方法,將地圖投影到一個地圖平面上。為了正確的在商業地圖 API 上疊加地圖數據,就必須使用該投影。最基本的是在商業地圖 API 上顯示柵格瓦片地圖一一例如TMS,WMS 以及其他類似的瓦片。為了更好的使用商業地圖 API,基于 GoogleMaps 的數據生成人員也需要使用該投影。最基本的例如 OpenStreetMap,柵格地圖瓦片都是使用的球面墨卡托投影GI
3、S 中,通常用 EPSG”的代碼來表示一種地圖投影。最常用的 EPSG:4326”,在地圖上將經緯度直接當作 X/Y 對待。球面墨卡托投影在官方指定的代碼為 EPSG:3785o 但是在官方發布之前,很多軟件已經使用了 EPSG:900931代碼來表示該投影,OpenLayers 仍然使用這個非官方的代碼。看到 EPSG:4326”字符,就是經緯度坐標的描述,看到EPSG:900931則是用米”做單位的 x/y 坐標的描述。創建地圖首先我們創建一個使用球面墨卡托投影白地圖。在這里我們使用基于微軟 VirtualEarthAPI 的地圖。以下的 HTML代碼將在地圖中用到。1 23OpenLay
4、ersExample45678910/Codegoeshere111213就下來添加 VirtualEarth 圖層作為地圖的基礎圖層1 varmap=newOpenLayers.Map(map);2varlayer=newOpenLayers.Layer.VirtualEarth(VirtualEarth,34sphericalMercator:true,5maxExtent:newOpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)6);7map.addLayer(layer);8map.zoomToMax
5、Extent。;這樣就創建了一副地圖。像這樣的地圖,應該著重注意:setCenter 不能再使用經緯度坐標,而應該是投影以后以米”為單位的坐標。你可以拖動該地圖,但是如果你不理解球面墨卡托投影,接下來做任何功能都將非常困難。該地圖的 maxResolution 根據一些默認值進行計算,通常球面墨卡托投影的地圖范圍是經度-180180,緯度-85.051185.0511,這是因為墨卡托投影兩極將變形到無窮遠處,必須排除掉北極和南極區域,剩下的區域投影后正好是一個正方形,投影后的范圍是從-20037508.34 至 U20037508.34。地圖的 maxResolution 默認值的計算方法是:
6、將該范圍匹配在邊長為 256 像素的圖片上,結果 maxResolution 的值就是 156543.0339。在圖層中默認的就是該值,不需要通過圖層 options 來設置了。如果將球面墨卡托投影的 WMS 或者 TMS 圖層作為一個單獨的圖層,需要指定圖層的 maxResolution 屬性,另外還需要定義該圖層的 maxExtent。使用投影坐標OpenLayers 提供了在客戶端進行投影變換的工具,可以將經緯度坐標setCenter 或者其他函數中需要使用坐標轉換,接著演示如何通過使用標系顯示為其他的投影坐標。Points,Bounds 投影變換首先創建一個投影對象作為默認的投影,標準
7、的經緯度投影的字符串是 EPSG:4326-基于 WGS84 的參考橢球面(如果你的數據和 GoogleMaps 匹配很準,就是這種投影)。接著創建一個對象保存你的坐標,然后轉換varproj=newOpenLayers.Projection(EPSG:4326);varpoint=newOpenLayers.LonLat(-71,42);point.transform(proj,map.getProjectionObject();該點已經轉換為球面墨卡托投影坐標,你可以傳遞給 map 的 setCenter 方法:map.setCenter(point);也可以直接在 setCenter 中
8、調用:varproj=newOpenLayers.Projection(EPSG:4326);varpoint=newOpenLayers.LonLat(-71,42);map.setCenter(point.transform(proj,map.getProjectionObject();通過這種方法,可以使用經緯度坐標來設置地圖中心。轉換為球面墨卡托坐標。文檔中首先在map 的 displayProjection 選項來將地圖的坐還可以使用相同的方法來投影變換 OpenLayers.Bounds 對象:同樣用 Bounds 對象的 transfrom 方法:varbounds=newOpe
9、nLayers.Bounds(-74.047185,40.679648,-73.907005,40.882078)bounds.transform(proj,map.getProjectionObject();坐標變換后替換掉原來的對象,因此不需要重新定義一個變量。Geometries 的投影變換Geometry 對象和 LonLat 與 Bounds 對象一樣擁有坐標轉換方法。在你的應用程序代碼中創建的 geometry 對象添加到圖層上之前,應該先進行坐標轉換,同樣從圖層獲取得到的 geometry 對象在別的地方使用,也需要坐標轉換。由于所有的坐標轉換都是更新對象自身,所以想添加一個 g
10、eometry 到圖層上,不應該直接調用轉換方法,而是克隆一個 geometry 對象后再調用:varfeature=vector_layer.features0;vargeometry=feature.geometry.clone();geometry.transform(layerProj,targetProj);矢量數據的投影變換創建一副帶投影的地圖后,很可能需要將矢量數據進行投影變換然后添加到基礎地圖上,完成這個工作,只需要簡單的設置好矢量數據的投影,并確定地圖的投影就可以了。varmap=newOpenLayers.Map(map,projection:newOpenLayers.P
11、rojection(EPSG:900913);varmyBaseLayer=newOpenLayers.Layer.Google(Google,sphericalMercator:true,maxExtent:newOpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34);map.addLayer(myBaseLayer);varmyGML=newOpenLayers.Layer.GML(GML,mygml.gml,projection:newOpenLayers.Projection(EPSG:4326);map
12、.addLayer(myGML);可以使用該方法加載任何 OpenLayers 支持格式的矢量數據,包括 WKT,GeoJSON,KML 和其他一些格式,在 GML 圖層上指定format 選項。vargeojson=newOpenLayers.Layer.GML(GeoJSON,geo.json,projection:newOpenLayers.Projection(EPSG:4326),format:OpenLayers.Format.GeoJSON);map.addLayer(geojson);設置了圖層的投影屬性后,如果手動添加 features 到圖層上(比如調用 layer.add
13、Features),在添加到圖層上之前必須進行坐標轉換。投影變換后的數據的序列化OpenLayers 中矢量數據序列化的方法是將矢量圖層上獲取數據集合傳遞給格式化類寫數據。在一個具有投影的地圖中,我們獲取到的數據是已經投影變換過的,為了進行數據轉換,需要使用內部投影和外部投影兩個參數給格式化類,然后再用格式化類序列化數據。varformat=newOpenLayers.Format.GeoJSON(internalprojection:newOpenLayers.Projection(EPSG:900913),externalProjection:newOpenLayers.Projectio
14、n(EPSG:4326);varjsonstring=format.write(vector_layer.features);在控件中顯示投影坐標有些控件可以將地圖坐標顯示給用戶,有的直接顯示,有的包含在超鏈接中。MousePosition 和 Permalink 控件(包括 ArgParser控件)都是用地圖所使用地圖投影坐標也就是球面墨卡托坐標。為了避免用戶混淆不清,OpenLayers可以通過 displayProjection 設置控件的坐標系,將地圖坐標系轉換為顯示坐標系。要使用這一功能,在創建地圖時需要指定 projection 和 displayProjection 選項,控件將
15、自動選擇這些選項的設置。varmap=newOpenLayers.Map(map,projection:newOpenLayers.Projection(EPSG:900913),displayProjection:newOpenLayers.Projection(EPSG:4326);map.addControl(newOpenLayers.Control.Permalink();map.addControl(newOpenLayers.Control.MousePosition();這樣你就可以正常加載地圖了創建球面墨卡托投影柵格圖片球面墨卡托投影如此重要的一個原因是只有這種投影能讓你將圖
16、片地圖正確的疊加到類似于 GoogleMaps 這樣的商業圖層上。在瀏覽器是使用柵格地圖,在一個瘦 GIS 客戶端是不可能對圖片進行重新投影,只能是所有的圖片使用同樣的投影。如何生成球面墨卡托投影的瓦片地圖取決于你使用什么軟件來創建地圖圖片。MapServer 的使用包含在此文檔中。MapServerMapServer 采用 proj.4 來支持地圖投影。為了轉換為球面墨卡托投影,需要在 proj.4 的 data 目錄下添加投影定義。Linux 環境下,打開/usr/share/proj/epsg 文件,在文件尾部添加一行:+proj=merc+a=6378137+b=6378137+lat
17、_ts=0.0+lon_0=0.0+x_0=0.0+y_0=0+k=1.0+units=m+nadgrids=null+no_defs然后在地圖文件中添加投影在 wms_srs 元數據中:mapwebmetadatawms_srsEPSG:4326EPSG:900913”endend#Layersgohereend這樣就可以通過 MapServer 的 WMS 服務請求使用球面墨卡托投影的瓦片地圖,通過 OpenLayers匹配。varoptions=projection:newOpenLayers.Projection(EPSG:900913),很好的和商業數據units:m,maxReso
18、lution:156543.0339,maxExtent:newOpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34);map=newOpenLayers.Map(map,options);/createGoogleMercatorlayersvargmap=newOpenLayers.Layer.Google(GoogleStreets,sphericalMercator:true,maxExtent:newOpenLayers.Bounds(-20037508.34,-20037508.34,20037508
19、.34,20037508.34);/createWMSlayervarwms=newOpenLayers.Layer.WMS(WorldMap,/wms/vmap0,layers:basic,transparent:true);map.addLayers(gmap,wms);WMS 圖層自動繼承地圖基礎圖層的投影,所以不需要在圖層中設置投影選項。GeoServer最新版的 GeoServer 已經支持 EPSG:900913,因此不需要額外添加投影。把 GeoServer 的圖層作為 WMS 添加到地圖上即可。自定義瓦片地圖另一個使用球面墨
20、卡托投影的場合是加載自定義的瓦片地圖。很多瓦片使用和 GoogleMaps 一樣的投影,而且是使用同樣的 z/x/y 語法來訪問瓦片。如果你的瓦片是依照 Google 的瓦片編碼規則(從世界的左上角開始,按照 x,y,z 編碼),通過簡單的修改 get_url 函數,就可以用TMS 圖層來加載這些瓦片。首先定義 getURL 函數:允許接受 bounds 作為參數,然后按照以下方法編寫:functionget_my_url(bounds)varres=this.map.getResolution。;varx=Math.round(bounds.left-this.maxExtent.left)
21、/(res*this.tileSize.w);vary=Math.round(this.maxExtent.top-bounds.top)/(res*this.tileSize.h);varz=this.map.getZoom。;varpath=z+/+x+/+y+.+this.type;varurl=this.url;if(urlinstanceofArray)url=this.selectUrl(path,url);)returnurl+path;)然后,創建 TMS 圖層,傳入一個選項告訴圖層自定義瓦片的加載函數是什么:newOpenLayers.Layer.TMS(Name,“http
22、:/ getURL 函數,請求自己的瓦片來代替標準的 TMS 瓦片。這樣做,你的地圖選項還需要包含和 GoogleMaps 一樣的 maxExtent 和 maxResolutionnewOpenLayers.Map(map,maxExtent:newOpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),numZoomLevels:18,maxResolution:156543.0339,units:m,projection:EPSG:900913”,displayProjection:newOpenLayer
23、s.Projection(EPSG:4326);球面墨卡托投影和 EPSG 的其他命名球面墨卡才投影在OpenLayers中使用代碼EPSG:900913,很多其他的服務比如OpenStreetMap,Bing和Yahoo也用同樣的投影,但并不一定要用 EPSG:900913 代碼,一些其他的代碼比如 EPSG:3857 和 EPSG:102113 也在使用。現在官方統一規定了代碼EPSG:3857 來代替 EPSG:900913(/export.htm?gml=urn:ogc:def:crs:EPSG:3857)。因此,如果你想合并OpenLayers 球面墨
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重慶科創職業學院《品影讀城》2023-2024學年第二學期期末試卷
- 廣東肇慶航空職業學院《無機及分析化》2023-2024學年第二學期期末試卷
- 天津理工大學《游泳(二)》2023-2024學年第二學期期末試卷
- 農業產業鏈整合及供應鏈優化合作合同
- 天津市職業大學《細胞生物學及細胞工程》2023-2024學年第二學期期末試卷
- 盤錦職業技術學院《現代西方社會思潮》2023-2024學年第二學期期末試卷
- 上海濟光職業技術學院《BIM技術及應用》2023-2024學年第二學期期末試卷
- 云南工程職業學院《醫學微生物與免疫學》2023-2024學年第二學期期末試卷
- 教育行業線上課程推廣效果表
- 科研試劑定制化生產服務行業跨境出海項目商業計劃書
- 電力行業招投標培訓
- 2024年云南省中考物理試題含答案
- 2024年石家莊市市屬國企業面向社會公開招聘403名管理人員及專業技術人員高頻難、易錯點500題模擬試題附帶答案詳解
- 醫藥代表聘用合同模板
- 2024-2030年中國公路工程行業市場發展分析及前景預判與投資研究報告
- 工傷預防宣傳和培訓 投標方案(技術方案)
- 古代小說戲曲專題-形考任務4-國開-參考資料
- 2.4圓周角(第1課時)(課件)九年級數學上冊(蘇科版)
- 桿塔組立施工安全檢查表
- 基于項目化學習的數學跨學科作業設計
- 小學綜合實踐活動二年級下冊第二單元《方格編》課件
評論
0/150
提交評論