首页 / 浏览问题 / 移动GIS / 问题详情
移动端如何对iServer地图服务进行几何对象编辑?
6EXP 2020年12月03日
使用产品:SuperMap iMobile 10i SP1 for Android

操作系统:win7 x64

问题详细描述:

董工你好,有几个关于手机端编辑几何对象的问题请教下:

1、请问是否只能在矢量图层上才能实现几何对象的编辑?

2、使用iServer发布的地图服务是否可以完成几个对象编辑的操作,还是说只能通过数据服务进行编辑?

3、如果我仅使用iServer发布的地图服务中的地图作为底图,通过其他渠道获取到几何对象的数据,是否可以在底图上直接编辑并与服务端实现上传、下载功能?

问题有点多,麻烦董工介绍下,不胜感激!
问题关闭原因: 已解决

1个回答

您好,1.几何对象编辑主要针对的是矢量图层,如果您想在没有矢量图层中进行编辑,只能是通过构造方法构造几何对象在跟踪图层上显示
2.地图服务不能对几何对象进行编辑,可以对数据服务进行编辑,实现思路为将数据下载到本地,修改完后更新到服务上,可以参考知识库--服务对接
3.跟第二个一样,服务编辑是针对数据服务的
9,232EXP 2020年12月03日
谢谢董工解答。

再请教下,在跟踪图层上添加点对象,是否只能通过代码来添加?如果现在想要直接手动在地图跟踪图层上添加或是编辑点对象是否能实现?
手动添加也是可以的,您那边可以自己写个监听来监听手势。通过手势点击事件获取到当前手指点击的屏幕坐标,然后通过map接口将屏幕坐标转换为地图坐标再添加到地图窗口,
好的,请问这个有具体的demo可供参考吗?

我现在的业务流程是首先需要从服务端请求到所有的点对象,然后加载到跟踪图层上,然后手动对某个点对象进行编辑或者新增,再将新增或编辑的点对象通过rest请求发送到服务端,在服务端更新。请问董工,这样一个流程是否能在跟踪图层实现,而不通过矢量图层或是数据服务?
这种方式使用跟踪图层不能完成,你要完成数据的更新操作建议直接将数据服务的数据集下载到本地添加到地图上显示,然后对该数据集进行增删改,最后再更新到服务器。可以参考知识库--服务对接--对数据服务的下载、更新操作

谢谢解答

董工,我想要在跟踪图层上根据经纬度标注出一些点对象,请问:

1、给这些点对象设置是否只能通过 geoStyle.setMarkerSymbolID(id)给这些点添加符号?

2、我在使用setMarkerSymbolID(id)调用符号的时候,id设置为任意值均只能加载出一个实心黑点符号。使用iDeskTop打开改iServer的rest服务的工作空间,发现点符号库中有很多符号,但是通过把符号id设置为这些已有符号的编号,仍然无法加载对应的符号,请问这是什么原因?符号库截图如下:

3、请问能不能对跟踪图层上加载的点对象设置点击事件,通过点击之后加载一些属性信息?

1.对点对象设置风格可以使用您说的这个方法,也可以使用callout设置图片。这个你可以参考demo:GeometryuInfo
2.符号库是存在工作空间里面的,如果您需要在移动端使用这些符号,您需要在移动端打开对应的工作空间并使用
3.跟踪图层上没有点击事件。弹出属性信息你可以参考demo:GeometryuInfo
董工您好,根据您之前的解答,我现在通过在底图上添加点标注(CallOut)的方式模拟了了添加对象的实现。但是现在由于有多个图层需要实现,请问现在有没有只基于一个iServer地图服务的基础上实现多个图层加载不同类型对象的方式?
能否详细说一下您的需求?
是这样的,根据用户的需求,我需要在地图上添加几个图层选项,比如有“学校”、“医院”、“公厕”这些图层,选择对应的图层之后,可以在地图上显示对应图层包含的点对象。

我现在通过callou实现了在地图上加载或是隐藏点对象的操作。但是现在有个问题,就是加载或是隐藏callout的方法貌似只有

mapview.showCallOut()、mapview.removeCallOut("name")、mapview.removeAllCallOut()。我现在可能面临一种业务场景,就是我选择加载三个图层类型的数据,然后我又想关闭其中两个图层开关,只显示一个类型的图层数据,这个时候如果是调用mapview.removeAllCallOut(),会隐藏所有图层的数据;如果调用mapview.removeCallOut("name"),这样就需要给所有的callout对象设置name,这种情况下如果数据量较大就比较繁琐了。

请问董工有没有更好的解决建议,谢谢
您可以这样做:每次关闭图层的时候可以把所有的callout全部移除掉,然后重新在地图上绘制当前地图的callout

这个我之前也考虑过,就是考虑到如果数据量太大,加载的时候可能从视觉上会有些卡顿,不过还是谢谢您的建议。

还想请教下逆地理编码的问题,我现在是获取经纬度之后通过对接online服务实现的,但是由于后期应用要使用专用网络,所以通过online服务实现逆地理编码就行不通了。请问您能帮我看下,我当前使用的iServer服务的服务列表中是否有对应的服务可以解决地理编码的问题吗,一下是我的服务列表 http://222.143.52.40:8080/iserver/services,麻烦您了

您的服务里面有个地址匹配服务:http://222.143.52.40:8080/iserver/services/addressmatch-Address/restjsr/v1/address/geocoding  您可以对他发get请求拿到对应的坐标点或者地名

非常感谢董工!

请问董工,下图中的坐标是什么坐标系的坐标?我要如何将地理坐标转换为以下坐标形式?

这个坐标是投影坐标系的,可以使用坐标点转换将其转换为地理坐标系。转换接口:CoordSysTranslator。具体方法你看下帮助文档接口介绍

董工,我通过以下代码将一个给定的地理坐标转(113.607931, 34.722896)换为投影坐标,但是结果(55683.71958786496,3844019.800383338)应该误差很大,请问是什么原因导致?

Point2Ds point2Ds2 = new Point2Ds();
Point2D point2D2 = new Point2D(113.607931, 34.722896);
point2Ds2.add(point2D2);

PrjCoordSys prjCoordSys = new PrjCoordSys();
Projection projection = new Projection();
projection.setType(ProjectionType.PRJ_GAUSS_KRUGER);
prjCoordSys.setProjection(projection);
PrjParameter prjParameter = new PrjParameter();
prjParameter.setCentralMeridian(113);
prjParameter.setStandardParallel1(0);
prjCoordSys.setPrjParameter(prjParameter);
boolean isSucess = CoordSysTranslator.forward(point2Ds2, prjCoordSys);
Point2D point2d = point2Ds2.getItem(0);

董工您好,我通过以下代码将一个给定的地理坐标转(113.607931, 34.722896)换为投影坐标,但是结果(55683.71958786496,3844019.800383338)应该误差很大,请问是什么原因导致,能指正下吗?谢谢!

Point2Ds point2Ds2 = new Point2Ds();
Point2D point2D2 = new Point2D(113.607931, 34.722896);
point2Ds2.add(point2D2);

PrjCoordSys prjCoordSys = new PrjCoordSys();
Projection projection = new Projection();
projection.setType(ProjectionType.PRJ_GAUSS_KRUGER);
prjCoordSys.setProjection(projection);
PrjParameter prjParameter = new PrjParameter();
prjParameter.setCentralMeridian(113);
prjParameter.setStandardParallel1(0);
prjCoordSys.setPrjParameter(prjParameter);
boolean isSucess = CoordSysTranslator.forward(point2Ds2, prjCoordSys);
Point2D point2d = point2Ds2.getItem(0);

您那边检查一下您设置的投影坐标系参数是否是正确的,我这边使用墨卡托投影的坐标系进行转换是没有问题的。
 

Point2Ds point2Ds2 = new Point2Ds();
Point2D point2D2 = new Point2D(113.607931, 34.722896);
point2Ds2.add(point2D2);
PrjCoordSys prjCoordSys = new PrjCoordSys(PrjCoordSysType.PCS_SPHERE_MERCATOR);
boolean isTrue = CoordSysTranslator.forward(point2Ds2,prjCoordSys);
谢谢董工,应该是投影坐标系选择的问题,使用墨卡托投影之后可以获取到有效数据
...