在Java中使用ArcGIS Java SDK 判断点是否在面内
面的地理数据是从ArcGIS Server 查询过来然后在项目运行时放入redis数据库中
点只有经纬度,是从MySql数据库中查询出来的集合中的属性
从ArcGIS Server 查询的过程与代码在上一篇ArcGIS Runtime API for Java 查询中
https://blog.youkuaiyun.com/weixin_50074995/article/details/117067751?spm=1001.2014.3001.5501
在查询过来后想存入redis的时候也遇到了问题
一开始存的是Iterator < Feature > 迭代器,但是发现取出来后根本用不了
然后试着存了结果集 FeatureQueryResult 也是一样的无法使用
后来试着把Feature 和 Geometry 存入,结果数据太多redis直接炸了
最后试着把 Geometry 用自带的 toJson 方法转为JSON字符串后放入List再放入redis这次就成功了
在功能模块中判断点是否在面内
先把从redis数据库里取出的JSON字符串转为 Geometry 几何对象
再根据从数据库中提出的经纬度新建为 point 点对象(必须先判断是否为空)
再使用 GeometryEngine 的 contains(geometry, point) 方法判断点是否在面中
但是在这一步出现了问题,错误提示是无效参数 Invalid argument
com.esri.arcgisruntime.ArcGISRuntimeException: Invalid argument
这个时候我尝试了把 point 转为 Geometry 对象再比较
尝试了直接强转 (Geometry) 和把 point 转为JSON字符串在转为 Geometry 对象
结果都解决不了这个问题,这个时候意识到可能不是对象的问题,毕竟 Point 也是 Geometry 的子类
后来研究了官方的API后发现Point 的构造方法中还有一个方法是带了
SpatialReference 参数的
https://developers.arcgis.com/java/api-reference/reference/com/esri/arcgisruntime/geometry/Point.html(官方地址)
查询后知道了 SpatialReference 是空间参考
https://developers.arcgis.com/java/api-reference/reference/com/esri/arcgisruntime/geometry/SpatialReference.html(官方地址)
然后就试着在 Point 新建的时候带入 Geometry 的空间参考
这次就能成功判断了