我正在使用GeoTools Java库进行一些几何计算。就我而言,我正在使用一个形状文件,其中包含某个城市的所有邻域多边形。我想知道该城市中每个可能的坐标,它对应的邻域。所以我的方法是简单地遍历邻域多边形并检查给定点是否在它们内部。这是一段提到的代码:
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: No factory of kind "PrimitiveFactory" found.
我只是简单地按照文档进行操作(This方法不起作用)。请注意我使用的是9-SNAPSHOT版本的GeoTools。
有关如何解决此问题的任何建议?
答案 0 :(得分:3)
我有类似的问题。通过遍历堆栈,我发现GeometryBuilder()没有几何工厂可供查找。如果没有工厂,GeometryBuilder会抛出一个没有类型的工厂“<你的工厂类型在这里>”例外。解决方案是http://docs.geotools.org/latest/userguide/unsupported/geometry/index.html。此插件包含使用org.geotools.geometry类所必需的工厂。
我正在使用Eclipse上的GeoTools 11.0
答案 1 :(得分:2)
好吧,我终于找到了一个可能的解决方案。首先,我必须说我犯了一个错误,因为我的多面体点是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 "";
}
答案 2 :(得分:-1)
创建一个点
点是大多数其他几何形状的构建块。以下部分介绍了如何操作点:
有几种方法可以创建一个点。 GeometryBuilder有许多用于创建几何的实用方法,因此您不必担心工厂。但您也可以直接使用工厂,或者也可以使用WKT解析器来创建点。
有几个createPoint方法作为GeometryBuilder的一部分提供。以下是使用其中一个的示例:
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)");