2014-02-11 35 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的答案来解决区分大小写问题。 –

相关问题