3

いくつかの幾何学的計算にGeoToolsJavaライブラリを使用しています。私の場合、特定の都市のすべての近隣マルチポリゴンを含むシェープファイルを使用しています。その都市で可能なすべての座標について、それがどの近隣に対応しているかを知りたいです。したがって、私のアプローチは、近隣のマルチポリゴン全体をループして、指定されたポイントがそれらの中にあるかどうかを確認することです。上記のコードの一部を次に示します。

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は「<yourfactorytypehere>」という種類のファクトリなしの例外をスローします。解決策はhttp://docs.geotools.org/latest/userguide/unsupported/geometry/index.htmlにあります。このプラグインには、org.geotools.geometryクラスを使用するために必要なファクトリが含まれています。

EclipseでGeoTools11.0を使用しています

于 2014-04-22T00:27:41.393 に答える
2

さて、私はついに可能な解決策を見つけました。まず、マルチポリゴンポイントがWGS84形式ではなくUTMであったため、間違いを犯したと言わなければなりません。そのため、事前の変換が必要でした。一方、コードでリファクタリングプロセスを実行する前は、次の方法でインスタンス化できなかったため、間違ったバージョンの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メソッドがあります。それらの1つを使用した例を次に示します。

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を使用して、Well-KnownTextからポイントを作成できます。

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 に答える