3

我正在使用 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.

我只是简单地遵循了文档,但没有取得多大成功(这种方法也不起作用)。请注意,我使用的是 9-SNAPSHOT 版本的 GeoTools。

关于如何摆脱这个问题的任何建议?

4

3 回答 3

3

我有一个类似的问题。通过跟踪堆栈,我发现没有可供 GeometryBuilder() 查找的几何工厂。如果没有工厂,GeometryBuilder 会抛出 No factory of kind "<your factory type here>" 异常。解决方案位于http://docs.geotools.org/latest/userguide/unsupported/geometry/index.html。该插件包括使用 org.geotools.geometry 类所必需的工厂。

我在 Eclipse 上使用 GeoTools 11.0

于 2014-04-22T00:27:41.393 回答
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 "";
}
于 2013-03-26T22:47:40.987 回答
-1

创建一个点

点是大多数其他几何图形的构建块。以下部分解释了如何操作点:

有几种方法可以创建一个点。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)");
于 2013-03-26T19:49:22.463 回答