首页 / 浏览问题 / 移动GIS / 问题详情
加载在线天地图作为底图,定位点显示会发生偏移,导入的shp矢量图层也会偏移
12EXP 2020年12月18日

地图已开启动态投影,天地图加载的2000坐标,矢量叠加 偏差很大。

定位点显示做了投影转换到当前地图坐标,代码如下:

// 当投影不是经纬坐标系时,则对点进行投影转换
Point2D result = point;
PrjCoordSys targetPrj = mMap.getPrjCoordSys();
if (targetPrj.getType() != PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE) {
    Point2Ds points = new Point2Ds();
    Point2D oldPoint = new Point2D(point.getX(), point.getY());
    points.add(oldPoint);
    PrjCoordSys desPrjCoorSys = new PrjCoordSys();
    desPrjCoorSys.setType(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE);
    CoordSysTranslator.convert(points, desPrjCoorSys, targetPrj,
            new CoordSysTransParameter(),
            CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION);
    result = points.getItem(0);
}

另外测试了在线谷歌地图,同样的代码偏差不大,而天地图缺偏了几千公里,请问是哪里不对吗?

1个回答

您好,您那边定位是采用什么方式定位的呢?加载天地图的时候你那边可以加上参数DPI=96(加载之前需要先把设备中的缓存全部删掉,重新加载)。定位点便宜大部分是因为定位的坐标和地图的坐标系不一致导致的,您可以参考一下这篇博客:https://blog.csdn.net/supermapsupport/article/details/80318735

9,232EXP 2020年12月18日
您好,用的是安卓自带的定位,定位出来的坐标是正确的WGS84经纬度,加了参数DPI=96也是一样的效果,可能偏了一千多公里...
您那边先确保定位出来的坐标是否正确,您可以把定位的坐标记录下来在iDesktop桌面软件看下位置是否正确。
确定定位坐标是正确的,并且加谷歌在线底图定位点转为gcj坐标,再投影坐标点后不会出现偏移的情况。

感觉坐标点转换和显示出的问题,是不是在线天地图的默认投影不支持坐标转换过去啊,这个天地图我在iDeskTop看着是地理坐标系,但是imbile地图也不能设置地理坐标系额...
天地图是什么坐标是根据你打开的url地址决定的,你要看你打开的天地图是投影坐标系的还是地理坐标系的。你的定位点在桌面看显示正常吗
坐标点定位出来是104.068,30.534,鼠标移动了一下大概率是正确的。同样的天地图链接,坐标系是地理坐标系 GCS_China_2000

您好,请问你这边有加载天地图(或者其他在线底图),再导入shp图层(标准的4523坐标系)正常叠加的demo吗crying,已经试了很多次都依旧不能叠在一起呀

首先你的数据的坐标系是不一致的,建议先对shp数据转换坐标系,转换为在线地图坐标系一致的坐标系,数据叠加就使用正常的添加图层就可以,没有相关的demo哈。

在线底图的坐标系在实际使用一般都很少有这类投影的shp,用户也不可能反复转换业务图层的坐标系,只能使用动态投影呀。同一个在线底图数据源和同一个UDB内的矢量图层利用idesktop动态投影直接可以叠加在一起,iMobile却不能crying

iMobile在线地图不支持动态投影,只能转换坐标系来解决叠加的问题
将在线底图作为地图坐标系,矢量业务图层也不可以动态投影过来吗?

您好,这种你只能先将在线地图添加到地图窗口,然后开启动态投影,最后添加其他坐标系的矢量数据。但是这种方式会比较耗性能。建议还是通过转坐标系。数据叠加代码参考如下:

WorkspaceConnectionInfo info2 = new WorkspaceConnectionInfo();
info2.setServer(rootPath+"/SuperMap/DYX/World.smwu");
info2.setType(WorkspaceType.SMWU);
boolean isTrue =m_workspace.open(info2);
String name = m_workspace.getMaps().get(0);

DatasourceConnectionInfo info = new DatasourceConnectionInfo();
info.setServer("http://t2.supermapcloud.com/");
info.setEngineType(EngineType.SuperMapCloud);
info.setAlias("test");
Datasource datasource = m_workspace.getDatasources().open(info);
m_mapcontrol.getMap().getLayers().add(datasource.getDatasets().get(0),true);
Datasource datasource2 = m_workspace.getDatasources().get(0);
Dataset dataset = datasource2.getDatasets().get("New_Point_1");
m_mapcontrol.getMap().setDynamicProjection(true);
m_mapcontrol.getMap().getLayers().add(dataset,true);
m_mapcontrol.getMap().refresh();
我是初始化Map就开启了动态投影,然后添加在线底图,再添加矢量的方式,最后不能叠加不到一起,这和这种方式不一样吗?
你那种肯定不行的,初始化的时候地图都没有坐标系,你按照我上面的写法哈
嗯,确实是,原来这样,确实图层出来了,非常感谢。动态投影的图层应该如何获取图层显示范围呢?
获取图层的显示范围还是地图的显示范围呢?获取的范围坐标是按照地图的坐标系来定的
就是想要地图坐标系的范围,但Layer 的并没有找到获取范围的方法,只找到有Dateset有一个getBounds但范围好像是按照数据的坐标系,
dataset的bounds肯定是按照数据的范围来的,地图范围就是按照地图的坐标系来的。如果数据和地图的坐标系不一致要设置范围可以对bounds进行投影转换来设置显示的范围。
...