首页 / 浏览问题 / 移动GIS / 问题详情
imobile 如何根据EPSG创建坐标系?
76EXP 2023年05月29日
因为加载了在线的天地图,地图获取的坐标系不正确,如何根据EPSG 创建坐标系(idesktop中有此功能)
问题关闭原因: 解决,天地图地址添加DPI参数等

1个回答

您好,1.请问加载了天地图后获取地图坐标系哪里不准确呢,一般天地图就是4490坐标系或者墨卡托投影坐标系的,

2.imobile可以创建坐标系,可以用GeoCoordSys地理坐标系类自定义目标地理坐标系,其中可以设置坐标系单位、大地参照系对象以及中央子午线对象等参数;还有用PrjCoordSys(GeoCoordSys geoCoordSys, Projection projection, PrjParameter prjParameter, java.lang.String name)根据指定的参数来构造一个 PrjCoordSys即投影坐标系的新对象。
3,460EXP 2023年05月30日
获取Map中的PrjCoordSys对象然后toXML()转出来后里面的EPSGCODE为0,然后其他值也是默认值
<sml:CoordinateReferenceSystem>
<sml:Name>User Define</sml:Name>
<sml:Type>-1</sml:Type>
<sml:EPSGCode>0</sml:EPSGCode>
<sml:Units>METER</sml:Units>
<sml:DistUnits>METER</sml:DistUnits>
<sml:GeographicCoordinateSystem>
<sml:Name>User Define</sml:Name>
<sml:Type>-1</sml:Type>
<sml:EPSGCode>-1</sml:EPSGCode>
<sml:Units>DEGREE</sml:Units>
<sml:DistUnits>METER</sml:DistUnits>
<sml:HorizontalGeodeticDatum>
<sml:Name>User Define</sml:Name>
<sml:Type>-1</sml:Type>
<sml:Spheroid>
<sml:Name/>
<sml:Type>-1</sml:Type>
<sml:SemiMajorAxis>6378137</sml:SemiMajorAxis>
<sml:InverseFlattening>298.257220427</sml:InverseFlattening>
</sml:Spheroid>
</sml:HorizontalGeodeticDatum>
<sml:PrimeMeridian>
<sml:Name/>
<sml:Type>-1</sml:Type>
<sml:PrimeMeridian>0</sml:PrimeMeridian>
</sml:PrimeMeridian>
</sml:GeographicCoordinateSystem>
<sml:MapProjection>
<sml:Name/>
<sml:Type>43045</sml:Type>
</sml:MapProjection>
<sml:Parameters>
<sml:FalseEasting>0</sml:FalseEasting>
<sml:FalseNorthing>0</sml:FalseNorthing>
<sml:CentralMeridian>0</sml:CentralMeridian>
<sml:StandardParallel1>0</sml:StandardParallel1>
<sml:StandardParallel2>0</sml:StandardParallel2>
<sml:ScaleFactor>0.9996</sml:ScaleFactor>
<sml:CentralParallel>0</sml:CentralParallel>
<sml:Azimuth>0</sml:Azimuth>
<sml:FirstPointLongitude>0</sml:FirstPointLongitude>
<sml:SecondPointLongitude>0</sml:SecondPointLongitude>
<sml:RectifiedAngle>0</sml:RectifiedAngle>
</sml:Parameters>
</sml:CoordinateReferenceSystem>
因为我要获取到这个坐标系转坐标定位,转出来的坐标然后定位会偏移,比如我的位置是在重庆,转出来的坐标定位到西藏那块去了
比较起来,创建坐标系还是麻烦一些,那边添加天地图后,建议直接从天地图的数据源中的数据集获取坐标系
你的意思是通过如下代码获取坐标系吗?如果是的,那么这种方式获取出来的坐标系跟map获取出来的坐标系是一样的,即结果跟上面所说的内容都是一样的。
val datasources: Datasources = mWorkspace!!.datasources
                ds = datasources.open(datasourceConnectionInfo)
                if (ds != null) {
                    val dataset=ds.datasets.get(0)
//此处根据dataset.prjCoordSys.toXML()获取出来的坐标系结果还是上面所说的坐标系

                }
获取坐标系结果是墨卡托坐标系的,没有错误,建议在桌面操作一下点坐标转换
桌面如何转?您的意思是在桌面加载天地图,然后设置坐标系导出工作空间然后在移动端加载吗?
坐标转换可以用CoordSysTranslator投影转换类,比如要把gps获取到的经纬度信息放到墨卡托天地图上面显示,应该把经纬度赋到point2d,再用一point2ds接收point2d,再用CoordSysTranslator.convert(Point2Ds points, PrjCoordSys sourcePrjCoordSys, PrjCoordSys targetPrjCoordSys, CoordSysTransParameter coordSysTransParameter, CoordSysTransMethod coordSysTransMethod)此方法根据源投影坐标系与目标投影坐标系对坐标点串进行投影转换,结果将直接改变源坐标点串,这里的sourcePrjCoordSys可以赋值为new PrjCoordSys(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE),targetPrjCoordSys则用map.getPrjCoordsys,CoordSysTransParameter一般没要求只用一实例对象就行,最后的转换方法用CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION基于地心的三参数转换法,之后会直接改变一开始point2ds中点的值

我试了下你说的这种方法(如下),转出来的坐标还是定位到了西藏那块去了(gps位置在重庆):

val p = Point2D(point!!.x, point!!.y)
val ps = Point2Ds()
ps.add(p)
try {

    val sourcePrjCoordSys=PrjCoordSys(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE)
    val targetPrjCoordSys=mMap!!.prjCoordSys
    val coordSysTransParameter=CoordSysTransParameter()
    val method=CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION
    CoordSysTranslator.convert(ps,sourcePrjCoordSys,targetPrjCoordSys,coordSysTransParameter,method)
} catch (e: Exception) {
    Log.e("转换坐标失败!","${e.message.toString()}")

}
point.x = ps.getItem(0).x
point.y = ps.getItem(0).y
CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION这个好像是基于地心的三参数转换法
口误,是三参数转换方法,感谢指正已纠正,另外dpi也是需要注意的,通常使用96
...