Java 地理工具-创建点
我正在使用GeoTools Java库进行一些几何计算。在我的例子中,我使用的是一个形状文件,其中包含某个城市的所有邻域多多边形。我想知道那个城市的每一个可能的坐标,它对应于哪个街区。因此,我的方法就是简单地在邻近的多个多边形上循环,并检查给定的点是否在这些多边形内。下面是一段提到的代码:Java 地理工具-创建点,java,geotools,jts,Java,Geotools,Jts,我正在使用GeoTools Java库进行一些几何计算。在我的例子中,我使用的是一个形状文件,其中包含某个城市的所有邻域多多边形。我想知道那个城市的每一个可能的坐标,它对应于哪个街区。因此,我的方法就是简单地在邻近的多个多边形上循环,并检查给定的点是否在这些多边形内。下面是一段提到的代码: public String getNeighborhoodId(Coordinates c){ for(Feature f : neighborhoods){ MultiPolygon
public String getNeighborhoodId(Coordinates c){
for(Feature f : neighborhoods){
MultiPolygon m = (MultiPolygon) f.getProperty("geometry").getValue();
GeometryBuilder builder = new GeometryBuilder(DefaultGeographicCRS.WGS84);
Point p = builder.createPoint(c.getLat(),c.getLng());
if(m.contains((Geometry) point)){
return f.getProperty("neighborhoodId").getValue().toString();
}
}
return "";
}
其中邻域是以前从形状文件中读取的所有要素。问题在于,在这条线上:
Point p = builder.createPoint(c.getLat(),c.getLng());
我得到org.geotools.factory.FactoryNotFoundException:找不到“PrimitiveFactory”类型的工厂。
我只是简单地按照文档进行操作,但没有取得多大成功(这种方法也不起作用)。请注意,我使用的是GeoTools的9-SNAPSHOT版本
关于如何解决这个问题有什么建议吗?创建一个点
点是大多数其他几何图形的构造块。以下各节介绍了如何操纵点:
有几种方法可以用来创建点。GeometryBuilder有许多创建几何图形的实用方法,因此您不必担心工厂。但您也可以直接使用工厂,也可以使用WKT解析器创建点
GeometryBuilder提供了几种createPoint方法。下面是使用其中一个的示例:
GeometryBuilder builder = new GeometryBuilder( DefaultGeographicCRS.WGS84 );
Point point = builder.createPoint( 48.44, -123.37 );
使用工厂
在某些环境中,您仅限于使用正式的gt opengis接口,下面是一个使用PositionFactory和PrimitiveFactory的示例:
Hints hints = new Hints( Hints.CRS, DefaultGeographicCRS.WGS84 );
PositionFactory positionFactory = GeometryFactoryFinder.getPositionFactory( hints );
PrimitiveFactory primitiveFactory = GeometryFactoryFinder.getPrimitiveFactory( hints );
DirectPosition here = positionFactory.createDirectPosition( new double[]{48.44, -123.37} );
Point point1 = primitiveFactory.createPoint( here );
PositionFactory has a helper method allowing you to save one step:
Hints hints = new Hints( Hints.CRS, DefaultGeographicCRS.WGS84 );
PrimitiveFactory primitiveFactory = GeometryFactoryFinder.getPrimitiveFactory( hints );
Point point2 = primitiveFactory.createPoint( new double[]{48.44, -123.37} );
System.out.println( point2 );
使用WKT
您可以使用WKTParser从已知文字创建点:
WKTParser parser = new WKTParser( DefaultGeographicCRS.WGS84 );
Point point = (Point) parser.parse("POINT( 48.44 -123.37)");
您还可以创建WKTParser以使用一组特定的工厂:
Hints hints = new Hints( Hints.CRS, DefaultGeographicCRS.WGS84 );
PositionFactory positionFactory = GeometryFactoryFinder.getPositionFactory(hints);
GeometryFactory geometryFactory = GeometryFactoryFinder.getGeometryFactory(hints);
PrimitiveFactory primitiveFactory = GeometryFactoryFinder.getPrimitiveFactory(hints);
AggregateFactory aggregateFactory = GeometryFactoryFinder.getAggregateFactory(hints);
WKTParser parser = new WKTParser( geometryFactory, primitiveFactory, positionFactory, aggregateFactory );
Point point = (Point) parser.parse("POINT( 48.44 -123.37)");
嗯,我终于找到了一个可能的解决办法。首先,我必须说我犯了一个错误,因为我的多多边形点是UTM格式的,而不是WGS84格式的,所以需要事先转换。另一方面,我认为我使用了一个错误版本的GeometryFactory类,就像我在代码重构过程之前一样,我无法用以下方式实例化它:
public String getNeighborhoodId(Coordinates c){
GeometryFactory geometryFactory = new GeometryFactory();
String utm = converter.latLon2UTM(c.getLat(), c.getLng());
Coordinate coords = new Coordinate(Double.valueOf(utm.split(" ")[2]),Double.valueOf(utm.split(" ")[3]));
Geometry point = geometryFactory.createPoint(coords);
for(Feature f : neighborhoods){
MultiPolygon m = (MultiPolygon) f.getProperty("geometry").getValue();
if(m.contains(point)){
return f.getProperty("neighborhoodId").getValue().toString();
}
}
return "";
}
我也有类似的问题。通过跟踪堆栈,我发现GeometryBuilder()找不到几何体工厂。如果没有工厂,GeometryBuilder将抛出一个类似“无工厂”的异常。解决之道在于。该插件包括使用org.geotools.geometry类所需的工厂
我正在Eclipse上使用GeoTools 11.0我也可以阅读文档,谢谢。如前所述,我实际上在跟踪他们,但没有取得多大成功。我正试图为我的问题找到一个更有效的解释。直接从