使用GeoTools更改从Shapefile读取的几何形状的精度

3
我将使用GeoTools来读取Shapefile中的几何数据,就像这个例子一样。 我注意到源Shapefile中使用的坐标已调整为Java Double类型。因此,几何图形与Shapefile中的不完全相同。我想增加这些几何图形的精度。有什么想法吗?
例如:我从Shapefile中获得了这个几何体:
POLYGON ((
  4799826.09861662145704 2773995.445373429451138,
  4799743.315226384438574 2773981.06054604658857,
  4799740.81541012506932 2774021.374029533006251,
  4799823.087954664602876 2774033.434061083011329,
  4799826.09861662145704 2773995.445373429451138
))

我已经使用GeoTools读取了Shapefile的几何信息,并打印出了其Well Known Text表示。输出结果如下:

POLYGON ((
  4799826.098616621 2773995.4453734295, 
  4799743.315226384 2773981.0605460466, 
  4799740.815410125 2774021.374029533, 
  4799823.087954665 2774033.434061083, 
  4799826.098616621 2773995.4453734295
))

你能解释一下你所看到的差异是什么吗?除非你在处理轨道上的原子,否则很少需要超过双精度来处理地理特征。 - Ian Turton
我在问题中更新了一个示例@iant。 - Dimis
1
假设您的坐标以米为单位,那么不需要担心任何超过0.001毫米的数字。 - Ian Turton
2个回答

3

最佳答案

使用org.locationtech.jts.precision.GeometryPrecisionReducer,它有reduce(Geometry g, PrecisionModel precModel)方法。

糟糕的答案

使用Geotools 18.0版本,从Shapefile中加载要素,并在其上调用getDefaultGeometry()

对您的Geometry对象调用getCoordinates(),然后循环遍历这些坐标,并在每个坐标上调用precisionModel.makePrecise()。最后,使用修复精度的坐标构造一个新几何体。

(我没有样例代码因为我使用Clojure而不是Java进行工作。)

错误的答案

这显然是一种麻烦且绕路的方式。难道没有更简单的方法吗?根据文档,我以为有,但它不起作用。

PrecisionModel JavaDoc中得知:

JTS输入程序在创建几何体之前会自动将坐标舍入到精度模型

对我来说,这意味着我只需使用几何体工厂重新构造几何体即可。

不幸的是,实际发生的是您会得到看起来应该相交的几何体,但由于其坐标中的微小浮点误差而不相交。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接