OpenLayers中的球面墨卡托投影_第1页
OpenLayers中的球面墨卡托投影_第2页
OpenLayers中的球面墨卡托投影_第3页
OpenLayers中的球面墨卡托投影_第4页
OpenLayers中的球面墨卡托投影_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论