2014-02-11 36 views
2

我有一個形狀文件(Sample.shp)以及兩個其他文件(Sample.shx和Sample.dbf),它具有爲Bombay的15個pincode定義的幾何(多邊形)。使用Geotools從shapefile中提取多邊形

我可以使用快速入門教程查看.shp文件。

File file = JFileDataStoreChooser.showOpenFile("shp", null); 
    if (file == null) { 
     return; 
    } 

    FileDataStore store = FileDataStoreFinder.getDataStore(file); 
    SimpleFeatureSource featureSource = store.getFeatureSource(); 

    // Create a map content and add our shapefile to it 
    MapContent map = new MapContent(); 
    map.setTitle("Quickstart"); 

    Style style = SLD.createSimpleStyle(featureSource.getSchema()); 
    Layer layer = new FeatureLayer(featureSource, style); 
    map.addLayer(layer); 

    // Now display the map 
    JMapFrame.showMap(map); 

現在,我想這15個pincodes的幾何形狀轉換爲15幾何/多邊形對象,以便我可以使用Geometry.contains()找到一個點是否落在特定的幾何/多邊形。

我想:

ShapefileReader r = new ShapefileReader(new ShpFiles(file),true,false,geometryFactory); 
System.out.println(r.getCount(0)); >> returns 51 
System.out.println(r.hasNext()); >> returns false 

任何幫助,非常感謝

回答

0

其實你並不需要提取幾何你的自我 - 只需要創建一個過濾器,並通過過濾收集迭代。在你的情況下,可能只會返回一個功能。

Filter pointInPolygon = CQL.toFilter("CONTAINS(the_geom, POINT(1 2))"); 
SimpleFeatureCollection features = source.getFeatures(filter); 

    SimpleFeatureIterator iterator = features.features(); 
    try { 
     while (iterator.hasNext()) { 
      SimpleFeature feature = iterator.next(); 
      Geometry geom = (Geometry) feature.getDefaultGeometry(); 
      /*... do something here */ 
     } 
    } finally { 
     iterator.close(); // IMPORTANT 
    } 

用於查詢的數據存儲的充分討論見Query Lab

+0

感謝您的回覆。看起來這應該爲我工作。我試過featureSource.getFeatures()。size()>> 15(這是正確的,因爲我有15個多邊形)。但是當我做Filter filter = CQL.toFilter(「CONTAINS(THE_GEOM,POINT(72.83 18.94))」);然後featureSource.getFeatures(filter)>> NULL(這應該返回1的大小,因爲此點位於其中一個多邊形中)。 Google的座標是(18.94,72.83)有什麼建議嗎? – Manisha

+0

嘗試POINT(72.83 18.94) - 緯度/經度和x/y不直觀 –

+0

嘿感謝您的解決方案..我只是改變了「THE_GEOM」爲「the_geom」,它的工作。 – Manisha

0

我使用了上述解決方案並嘗試了幾種組合。剛剛將「THE_GEOM」更改爲小寫字母,並且POINT正常(Lon Lat)

Filter filter = CQL.toFilter("CONTAINS(the_geom, POINT(72.82916 18.942883))"); 
SimpleFeatureCollection collection=featureSource.getFeatures(filter); 
SimpleFeatureIterator iterator = collection.features(); 

     try { 
      while (iterator.hasNext()) { 
       SimpleFeature feature = iterator.next(); 
       ..... 
      } 
     } finally { 
      iterator.close(); // IMPORTANT 
     } 
+0

接受iant的回答會很好,因爲你的變化很小。 –

+0

是的,我同意。但我想指導用戶確切的解決方案,我可以選擇一個正確的答案。希望你能理解 – Manisha

+0

好的。我編輯了iant的答案來解決區分大小寫問題。 –

相關問題