2013-03-26 647 views
3

我正在使用GeoTools Java庫進行一些幾何計算。就我而言,我使用的是一個包含某個城市所有鄰域多邊形的形狀文件。我想知道該城市中每個可能的座標,它在哪個鄰域對應。所以我的方法只是循環遍歷鄰域多邊形,並檢查給定的點是否在它們內部。下面是一段提到的代碼:Geotools - 創建一個點

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。

關於如何擺脫這個問題的任何建議?

回答

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 ""; 
} 
0

創建點

點是大多數其他幾何形狀的構件。以下部分介紹如何操作點:

有幾種方法可以創建點。 GeometryBuilder有許多用於創建幾何的實用方法,因此您不必擔心工廠。但是您也可以直接使用工廠,或者也可以使用WKT分析器來創建點。

作爲GeometryBuilder的一部分提供了幾種createPoint方法。下面是使用其中的一個例子:

GeometryBuilder builder = new GeometryBuilder(DefaultGeographicCRS.WGS84); 
Point point = builder.createPoint(48.44, -123.37); 

使用工廠 在某些環境中,你被限制只使用正規的GT-開放GIS接口,下面是一個使用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)"); 
+1

我也可以閱讀文檔,謝謝。如上所述,我實際上是在追隨他們而沒有取得太大的成功。我試圖找到一個更有效的解釋我的問題。 – jarandaf 2013-03-26 20:40:24

+0

直接複製來自http://docs.geotools.org/latest/userguide/unsupported/geometry/build.html – jonayreyes 2016-04-12 13:12:11