OpenLayers中的球面墨卡托投影_第1頁(yè)
OpenLayers中的球面墨卡托投影_第2頁(yè)
OpenLayers中的球面墨卡托投影_第3頁(yè)
OpenLayers中的球面墨卡托投影_第4頁(yè)
OpenLayers中的球面墨卡托投影_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、OpenLayers 中的球面墨卡托投影最近看 OpenLayers,研究到地圖投影時(shí)找到官方的文檔,就翻譯了一下,由于英文能力差,翻譯不好的地方,請(qǐng)看原文原文地址:/library/sphericalmercator.html球面墨卡托投影該文檔說(shuō)明了什么是球面墨卡托投影以及何時(shí)使用該投影。文檔中包含一些必要的背景知識(shí)、商用圖層的代碼演示、添加 WMS圖層以及使用 OpenLayers 進(jìn)行投影變換的內(nèi)容。要求讀者對(duì)投影變換和 OpenLayers 有一個(gè)基本的了解。什么是球面墨卡托投影?球面墨卡托投影在 OpenLayerscommunit

2、y 版本和其他 OSGcommunity 版本中都有使用。GoogleMaps,微軟VirtualEarth,YahooMaps 和其他商業(yè)地圖 API 的提供者都使用該投影。該投影是將地球當(dāng)作一個(gè)球體而不是橢球體,然后應(yīng)用墨卡托投影的方法,將地圖投影到一個(gè)地圖平面上。為了正確的在商業(yè)地圖 API 上疊加地圖數(shù)據(jù),就必須使用該投影。最基本的是在商業(yè)地圖 API 上顯示柵格瓦片地圖一一例如TMS,WMS 以及其他類似的瓦片。為了更好的使用商業(yè)地圖 API,基于 GoogleMaps 的數(shù)據(jù)生成人員也需要使用該投影。最基本的例如 OpenStreetMap,柵格地圖瓦片都是使用的球面墨卡托投影GI

3、S 中,通常用 EPSG”的代碼來(lái)表示一種地圖投影。最常用的 EPSG:4326”,在地圖上將經(jīng)緯度直接當(dāng)作 X/Y 對(duì)待。球面墨卡托投影在官方指定的代碼為 EPSG:3785o 但是在官方發(fā)布之前,很多軟件已經(jīng)使用了 EPSG:900931代碼來(lái)表示該投影,OpenLayers 仍然使用這個(gè)非官方的代碼??吹?EPSG:4326”字符,就是經(jīng)緯度坐標(biāo)的描述,看到EPSG:900931則是用米”做單位的 x/y 坐標(biāo)的描述。創(chuàng)建地圖首先我們創(chuàng)建一個(gè)使用球面墨卡托投影白地圖。在這里我們使用基于微軟 VirtualEarthAPI 的地圖。以下的 HTML代碼將在地圖中用到。1 23OpenLay

4、ersExample45678910/Codegoeshere111213就下來(lái)添加 VirtualEarth 圖層作為地圖的基礎(chǔ)圖層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。;這樣就創(chuàng)建了一副地圖。像這樣的地圖,應(yīng)該著重注意:setCenter 不能再使用經(jīng)緯度坐標(biāo),而應(yīng)該是投影以后以米”為單位的坐標(biāo)。你可以拖動(dòng)該地圖,但是如果你不理解球面墨卡托投影,接下來(lái)做任何功能都將非常困難。該地圖的 maxResolution 根據(jù)一些默認(rèn)值進(jìn)行計(jì)算,通常球面墨卡托投影的地圖范圍是經(jīng)度-180180,緯度-85.051185.0511,這是因?yàn)槟ㄍ型队皟蓸O將變形到無(wú)窮遠(yuǎn)處,必須排除掉北極和南極區(qū)域,剩下的區(qū)域投影后正好是一個(gè)正方形,投影后的范圍是從-20037508.34 至 U20037508.34。地圖的 maxResolution 默認(rèn)值的計(jì)算方法是:

6、將該范圍匹配在邊長(zhǎng)為 256 像素的圖片上,結(jié)果 maxResolution 的值就是 156543.0339。在圖層中默認(rèn)的就是該值,不需要通過(guò)圖層 options 來(lái)設(shè)置了。如果將球面墨卡托投影的 WMS 或者 TMS 圖層作為一個(gè)單獨(dú)的圖層,需要指定圖層的 maxResolution 屬性,另外還需要定義該圖層的 maxExtent。使用投影坐標(biāo)OpenLayers 提供了在客戶端進(jìn)行投影變換的工具,可以將經(jīng)緯度坐標(biāo)setCenter 或者其他函數(shù)中需要使用坐標(biāo)轉(zhuǎn)換,接著演示如何通過(guò)使用標(biāo)系顯示為其他的投影坐標(biāo)。Points,Bounds 投影變換首先創(chuàng)建一個(gè)投影對(duì)象作為默認(rèn)的投影,標(biāo)準(zhǔn)

7、的經(jīng)緯度投影的字符串是 EPSG:4326-基于 WGS84 的參考橢球面(如果你的數(shù)據(jù)和 GoogleMaps 匹配很準(zhǔn),就是這種投影)。接著創(chuàng)建一個(gè)對(duì)象保存你的坐標(biāo),然后轉(zhuǎn)換varproj=newOpenLayers.Projection(EPSG:4326);varpoint=newOpenLayers.LonLat(-71,42);point.transform(proj,map.getProjectionObject();該點(diǎn)已經(jīng)轉(zhuǎn)換為球面墨卡托投影坐標(biāo),你可以傳遞給 map 的 setCenter 方法:map.setCenter(point);也可以直接在 setCenter 中

8、調(diào)用:varproj=newOpenLayers.Projection(EPSG:4326);varpoint=newOpenLayers.LonLat(-71,42);map.setCenter(point.transform(proj,map.getProjectionObject();通過(guò)這種方法,可以使用經(jīng)緯度坐標(biāo)來(lái)設(shè)置地圖中心。轉(zhuǎn)換為球面墨卡托坐標(biāo)。文檔中首先在map 的 displayProjection 選項(xiàng)來(lái)將地圖的坐還可以使用相同的方法來(lái)投影變換 OpenLayers.Bounds 對(duì)象:同樣用 Bounds 對(duì)象的 transfrom 方法:varbounds=newOpe

9、nLayers.Bounds(-74.047185,40.679648,-73.907005,40.882078)bounds.transform(proj,map.getProjectionObject();坐標(biāo)變換后替換掉原來(lái)的對(duì)象,因此不需要重新定義一個(gè)變量。Geometries 的投影變換Geometry 對(duì)象和 LonLat 與 Bounds 對(duì)象一樣擁有坐標(biāo)轉(zhuǎn)換方法。在你的應(yīng)用程序代碼中創(chuàng)建的 geometry 對(duì)象添加到圖層上之前,應(yīng)該先進(jìn)行坐標(biāo)轉(zhuǎn)換,同樣從圖層獲取得到的 geometry 對(duì)象在別的地方使用,也需要坐標(biāo)轉(zhuǎn)換。由于所有的坐標(biāo)轉(zhuǎn)換都是更新對(duì)象自身,所以想添加一個(gè) g

10、eometry 到圖層上,不應(yīng)該直接調(diào)用轉(zhuǎn)換方法,而是克隆一個(gè) geometry 對(duì)象后再調(diào)用:varfeature=vector_layer.features0;vargeometry=feature.geometry.clone();geometry.transform(layerProj,targetProj);矢量數(shù)據(jù)的投影變換創(chuàng)建一副帶投影的地圖后,很可能需要將矢量數(shù)據(jù)進(jìn)行投影變換然后添加到基礎(chǔ)地圖上,完成這個(gè)工作,只需要簡(jiǎn)單的設(shè)置好矢量數(shù)據(jù)的投影,并確定地圖的投影就可以了。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 支持格式的矢量數(shù)據(jù),包括 WKT,GeoJSON,KML 和其他一些格式,在 GML 圖層上指定format 選項(xiàng)。vargeojson=newOpenLayers.Layer.GML(GeoJSON,geo.json,projection:newOpenLayers.Projection(EPSG:4326),format:OpenLayers.Format.GeoJSON);map.addLayer(geojson);設(shè)置了圖層的投影屬性后,如果手動(dòng)添加 features 到圖層上(比如調(diào)用 layer.add

13、Features),在添加到圖層上之前必須進(jìn)行坐標(biāo)轉(zhuǎn)換。投影變換后的數(shù)據(jù)的序列化OpenLayers 中矢量數(shù)據(jù)序列化的方法是將矢量圖層上獲取數(shù)據(jù)集合傳遞給格式化類寫數(shù)據(jù)。在一個(gè)具有投影的地圖中,我們獲取到的數(shù)據(jù)是已經(jīng)投影變換過(guò)的,為了進(jìn)行數(shù)據(jù)轉(zhuǎn)換,需要使用內(nèi)部投影和外部投影兩個(gè)參數(shù)給格式化類,然后再用格式化類序列化數(shù)據(jù)。varformat=newOpenLayers.Format.GeoJSON(internalprojection:newOpenLayers.Projection(EPSG:900913),externalProjection:newOpenLayers.Projectio

14、n(EPSG:4326);varjsonstring=format.write(vector_layer.features);在控件中顯示投影坐標(biāo)有些控件可以將地圖坐標(biāo)顯示給用戶,有的直接顯示,有的包含在超鏈接中。MousePosition 和 Permalink 控件(包括 ArgParser控件)都是用地圖所使用地圖投影坐標(biāo)也就是球面墨卡托坐標(biāo)。為了避免用戶混淆不清,OpenLayers可以通過(guò) displayProjection 設(shè)置控件的坐標(biāo)系,將地圖坐標(biāo)系轉(zhuǎn)換為顯示坐標(biāo)系。要使用這一功能,在創(chuàng)建地圖時(shí)需要指定 projection 和 displayProjection 選項(xiàng),控件將

15、自動(dòng)選擇這些選項(xiàng)的設(shè)置。varmap=newOpenLayers.Map(map,projection:newOpenLayers.Projection(EPSG:900913),displayProjection:newOpenLayers.Projection(EPSG:4326);map.addControl(newOpenLayers.Control.Permalink();map.addControl(newOpenLayers.Control.MousePosition();這樣你就可以正常加載地圖了創(chuàng)建球面墨卡托投影柵格圖片球面墨卡托投影如此重要的一個(gè)原因是只有這種投影能讓你將圖

16、片地圖正確的疊加到類似于 GoogleMaps 這樣的商業(yè)圖層上。在瀏覽器是使用柵格地圖,在一個(gè)瘦 GIS 客戶端是不可能對(duì)圖片進(jìn)行重新投影,只能是所有的圖片使用同樣的投影。如何生成球面墨卡托投影的瓦片地圖取決于你使用什么軟件來(lái)創(chuàng)建地圖圖片。MapServer 的使用包含在此文檔中。MapServerMapServer 采用 proj.4 來(lái)支持地圖投影。為了轉(zhuǎn)換為球面墨卡托投影,需要在 proj.4 的 data 目錄下添加投影定義。Linux 環(huán)境下,打開/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 元數(shù)據(jù)中:mapwebmetadatawms_srsEPSG:4326EPSG:900913”endend#Layersgohereend這樣就可以通過(guò) MapServer 的 WMS 服務(wù)請(qǐng)求使用球面墨卡托投影的瓦片地圖,通過(guò) OpenLayers匹配。varoptions=projection:newOpenLayers.Projection(EPSG:900913),很好的和商業(yè)數(shù)據(jù)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 圖層自動(dòng)繼承地圖基礎(chǔ)圖層的投影,所以不需要在圖層中設(shè)置投影選項(xiàng)。GeoServer最新版的 GeoServer 已經(jīng)支持 EPSG:900913,因此不需要額外添加投影。把 GeoServer 的圖層作為 WMS 添加到地圖上即可。自定義瓦片地圖另一個(gè)使用球面墨

20、卡托投影的場(chǎng)合是加載自定義的瓦片地圖。很多瓦片使用和 GoogleMaps 一樣的投影,而且是使用同樣的 z/x/y 語(yǔ)法來(lái)訪問(wèn)瓦片。如果你的瓦片是依照 Google 的瓦片編碼規(guī)則(從世界的左上角開始,按照 x,y,z 編碼),通過(guò)簡(jiǎn)單的修改 get_url 函數(shù),就可以用TMS 圖層來(lái)加載這些瓦片。首先定義 getURL 函數(shù):允許接受 bounds 作為參數(shù),然后按照以下方法編寫: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;)然后,創(chuàng)建 TMS 圖層,傳入一個(gè)選項(xiàng)告訴圖層自定義瓦片的加載函數(shù)是什么:newOpenLayers.Layer.TMS(Name,“http

22、:/ getURL 函數(shù),請(qǐng)求自己的瓦片來(lái)代替標(biāo)準(zhǔn)的 TMS 瓦片。這樣做,你的地圖選項(xiàng)還需要包含和 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,很多其他的服務(wù)比如OpenStreetMap,Bing和Yahoo也用同樣的投影,但并不一定要用 EPSG:900913 代碼,一些其他的代碼比如 EPSG:3857 和 EPSG:102113 也在使用。現(xiàn)在官方統(tǒng)一規(guī)定了代碼EPSG:3857 來(lái)代替 EPSG:900913(/export.htm?gml=urn:ogc:def:crs:EPSG:3857)。因此,如果你想合并OpenLayers 球面墨

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論