地图投影以及Proj4的使用

JavaScript016

地图投影以及Proj4的使用,第1张

简单来说,Map Projection是将球体或椭球体表面的经纬度转换成一个平面的位置的过程,即 将球面坐标转化为平面坐标的过程便称为投影

是一种正轴(投影面的轴(圆锥圆柱的轴线,平面的法线)与地球椭球体的旋转轴重合)、 等角(地面上的任意两条直线的夹角,在经过地球投影绘制到图纸上以后,其夹角保持不变)、圆柱投影 。由荷兰地图学家墨卡托(G.Mercator)于1569年创立。假设一个与地轴方向一致的圆柱切或割于地球,按等角条件,将经纬网投影到圆柱面上,将圆柱面展为平面后,即得到本投影。现在主流的网上地图信息服务所采用的投影均是Mercator投影,该投影方法也适用于航空和航海领域。

proj.4 是 OSGeo 出品的开源GIS工具,专注于地图的投影表达以及转换,截止到目前 官方 最新的发布版本是4.9.3。官方介绍:

由于我用的是Mac Pro,苹果用户如果没有安装Proj可以使用homebrew来安装

proj4官方列出了 三个应用 ,分别是:

可以使用如下命令来显示在 proj里的内置的有关地图投影的参数

一个典型的命令如下,详细的参数说明请参考 这里 :

命令行测试如下图:

目前CocoaPod上proj4最高的版本是4.8.0,当然你也可以集成到iOS项目中去

Map Projection WiKi

WGS84、World Geodetic System

proj.4官方介绍

proj.4通用参数

地图投影List

Proj.4库的编译及使用

GIS坐标转换库Proj.4的使用

PROJ4初探

spatialreference

您好,很高兴为您解答。为了200分,我手都要断了,不管有用没有用,采纳好么? 嗯,希望对您have帮助: 在地图的 panel 内添加控件: vlayer = new OpenLayers.Layer.Vector("控件层")map.addLayer(vlayer)// 定义面板 varpanel = new OpenLayers.Control.Panel()panel.addControls([ newOpenLayers.Control.DrawFeature( vlayer, OpenLayers.Handler. Path,{title: '测距', featureAdded:LengthFeatureAdd } ), newOpenLayers.Control.DrawFeature (vlayer, OpenLayers.Handler.Polygon, { title: '测面积',featureAdded: AreaFeatureAdd} )])//添加控制面板 map.addControl(panel)添加 js 代码文件:Ranging.js,记得添加引用。 //关闭Pupup的弹出对话框 functiononPopupClose(evt) { vlayer.removeFeatures(vlayer.features)map.removePopup(selectedFeature.popup)selectedFeature.popup.destroy()selectedFeature.popup =null} //测距 var EARTH_RADIUS =6378137function rad(d) { return d *Math.PI / 180.0} functionGetDistance(lat1, lon1, lat2, lon2) {var radLat1 = rad(lat1)var radLat2 =rad(lat2)var a = radLat1 - radLat2var b = rad(lon1) - rad(lon2)var s = 2* Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2) ))s = s * EARTH_RADIUSs = Math.round(s * 10000) / 10000return s}function LengthFeatureAdd(feature){ var distance=0var source = newProj4js.Proj('EPSG:900913')var dest= new Proj4js.Proj('WGS84')for(vari=1i<feature.geometry.components.length++i) { //投影转换 var p1 = newProj4js.Point(feature.geometry.components[i-1].x,feature.geome try.components[i-1].y)Proj4js.transform(source, dest, p1)var p2= new Proj4js.Point(feature.geometry.components[i].x,feature.geometr y.components[i].y)Proj4js.transform(source, dest, p2)distance=distance+GetDistance(p1.y,p1.x,p2.y,p2.x)} popup = newOpenLayers.Popup.FramedCloud("chicken", feature.geometry.getBounds().getCenterLonLat(), null, "<divstyle='font-size:.8em'>所测距离为: "+ distance.toFixed(1) + "米"+"</div>", null, true, onPopupClose )popup.autoSize = true feature.popup = popupselectedFeature =featuremap.addPopup(popup)}function AreaFeatureAdd(feature) {var pointX=new Array()varpointY=new Array()var source =new Proj4js.Proj('EPSG:900913')vardest = new Proj4js.Proj('WGS84')for(var i=0i<feature.geometry.components[0].components.length-1++i) { //投影转换 var p = new Proj4js.Point(feature.geometry.components[0].components[i].x,f eature.geometry.components[0].components[i].y)Proj4js.transform(source,dest, p)feature.geometry.components[0].components[i].x=p.xfeature.geometry.components[0].components[i].y=p.ypointX.push(p.x)pointY.push(p.y)} pointX.push(pointX[0])pointY.push(pointY[0])var area =calcArea(pointX,pointY)varinperd=OpenLayers.INCHES_PER_UNIT['km']if(inperd) { varinperm=OpenLayers.INCHES_PER_UNIT[this.map.getUnits()]area*=Math.pow((inperm/inperd),2)} popup =new OpenLayers.Popup.FramedCloud("chicken", feature.geometry.getBounds().getCenterLonLat(), null, "<div style='font-size:.8em'>所测面积为: " + area.