Java GeoTools使用WGS84输入和" EPSG:3857"搜索范围内的功能。形状

时间:2017-09-25 21:51:05

标签: java geotools

我有一个形状文件重新投影在" EPSG:3857"我试图找到一定范围内的特征,以我在lat / lon(WGS84)中得到的点数表示。

使用dwithin我需要通过一个高于实际距离的范围,因此,由于" EPSG:3857"和dwithin,我切换到缓冲几何,寻找距离我的点一定距离的特征。这是我的代码:

CoordinateReferenceSystem WGS84 =  CRS.decode("EPSG:4326",true);   //org.geotools.referencing.crs.DefaultGeographicCRS.WGS84 Google Earth;
CoordinateReferenceSystem EPSG3857 = CRS.decode("EPSG:3857",true); //WGS84 Pseudo-Mercator: shape reprojected CRS------------- String code = "AUTO:42001," + x + "," + y;
MathTransform transformToEPSG3857 = CRS.findMathTransform(WGS84, EPSG3857, false);

GeometryFactory geometryFactory2 = new GeometryFactory();
Geometry pointSource = geometryFactory.createPoint(coordinateSource); // coordinateSource is lat=41.942667 lon=12.462218
Geometry targetGeometry = JTS.transform(pointSource, transformToEPSG3857);

Geometry buffer = targetGeometry.buffer(distance);
buffer.setSRID(3857);
Filter pointInPolygon = filterFactory.contains(filterFactory.property("the_geom"), filterFactory.literal(buffer));
SimpleFeatureCollection features = shapeFileNamedCache.getFeatureSource().getFeatures(pointInPolygon);
System.out.println("Features: " + features.size() + " at distance in meters: " + distance);

我不明白为什么这段代码不能过滤掉任何功能,而我知道有。

任何建议都会对我有所帮助。

斯特凡诺。

缓冲区包含:

POLYGON ((1387457.7619147683 5152395.103885399, 1387454.4954124368 5152361.9385306565, 1387444.8214352953 5152330.047701897, 1387429.1117488598 5152300.6569457855, 1387407.97006757 5152274.895732597, 1387382.2088543817 5152253.754051308, 1387352.8180982703 5152238.044364872, 1387320.927269511 5152228.37038773, 1387287.7619147683 5152225.103885399, 1387254.5965600256 5152228.37038773, 1387222.7057312662 5152238.044364872, 1387193.3149751548 5152253.754051308, 1387167.5537619665 5152274.895732597, 1387146.4120806768 5152300.6569457855, 1387130.7023942412 5152330.047701897, 1387121.0284170997 5152361.9385306565, 1387117.7619147683 5152395.103885399, 1387121.0284170997 5152428.269240142, 1387130.7023942412 5152460.160068901, 1387146.4120806768 5152489.550825013, 1387167.5537619665 5152515.312038201, 1387193.3149751548 5152536.45371949, 1387222.7057312662 5152552.163405926, 1387254.5965600256 5152561.837383068, 1387287.7619147683 5152565.103885399, 1387320.927269511 5152561.837383068, 1387352.8180982703 5152552.163405926, 1387382.2088543817 5152536.45371949, 1387407.97006757 5152515.312038201, 1387429.1117488598 5152489.550825013, 1387444.8214352953 5152460.160068901, 1387454.4954124368 5152428.269240142, 1387457.7619147683 5152395.103885399))

以米为单位我通过170但属性更接近。通过QGIS将形状文件重新投影到WGS84 Pseudo-mercator中。奇怪的是,如果我使用CRS为ED_1950_UTM_Zone_33N的原始文件,距离是正确的,并且功能更接近预期(找到123米而不是167米)。

1 个答案:

答案 0 :(得分:0)

移动到相同的形状文件但未重新投影后,使用

sourceCRS = CRS.decode("EPSG:23033", true);

由于CRS不同,事情变得很糟糕。

之前:在地图上完美定位点,计算距离差50米

现在:点位置和距离都是大约3米的误差。

根本不知道为什么会发生这种情况(仍在寻找),但至少错误已经减少。

注意:要进行测试我正在使用Google地球,而KLM文件来自通过GIS进行的导出。