java-从shp文件读取坐标并计算距离

我想根据自然地球数据计算一个点到一个shp文件(ports.shp)的最近距离.

例如,我正在加载文件功能

...
String filename = "10m_cultural/ne_10m_ports.shp";
...


 public static void Calcs(String filename) 
    throws IOException, NoSuchAuthorityCodeException, FactoryException, TransformException {

    HashMap<String, Object> params = new HashMap<>();
    params.put("url", DataUtilities.filetoURL(new File(filename)));
    DataStore ds = DataStoreFinder.getDataStore(params);

    String name = ds.getTypeNames()[0];
    SimpleFeatureSource source = ds.getFeatureSource(name);
    SimpleFeatureCollection features = source.getFeatures();

}

现在,例如,我要从中计算距离的一点是:

GeometryFactory gf = JTSFactoryFinder.getGeometryFactory();
Point p = gf.createPoint(new Coordinate(43, 18));

我知道要计算距离,我会这样做:

     CoordinateReferenceSystem crs = CRS.decode("epsg:4326");           


      Point start = gf.createPoint(new Coordinate(43, 18));
      Point dest = gf.createPoint(new Coordinate(?????));

      GeodeticCalculator gc = new GeodeticCalculator(crs);
      gc.setStartingPosition(JTS.toDirectPosition(start.getCoordinate(), crs));
      gc.setDestinationPosition(JTS.toDirectPosition(dest.getCoordinate(), crs));


      double distance = gc.getorthodromicdistance();

但是我不知道如何找到目的地的坐标(ports.shp文件):

Point dest = gf.createPoint(new Coordinate(?????));

我具有加载文件功能,但没有任何getCoordinates()方法.

另外,正如我所见,ports.shp由许多POINT几何组成.我是否必须以某种方式计算参考点的每个点,然后选择最近的点?

解决方法:

功能部件具有getDefaultGeometry方法,该方法将为您提供所需的点.然后,您可以从该点获取坐标.

编辑

您的问题是单位不匹配,您将Mindist设置为边界框的宽度(以度为单位,大约为360),但将其与以米为单位的距离(大约为7800000)进行比较,因此您找不到一个足以保存的点.

我开始通过限制初始搜索范围来提高搜索效率,但是即使使用了我无法确定是否有效的填充位置数据集,它也足够快.

    final double MAX_SEARCH_disTANCE = Math.max(index.getBounds().getWidth(), index.getBounds().getHeight());
    double searchdist = 0.01;

    while (searchdist < MAX_SEARCH_disTANCE) {
        // start point (user input)
        Coordinate coordinate = p.getCoordinate();

        ReferencedEnvelope search = new ReferencedEnvelope(new Envelope(coordinate),
                index.getSchema().getCoordinateReferenceSystem());

        search.expandBy(searchdist);
        BBox bBox = ff.bBox(ff.property(index.getSchema().getGeometryDescriptor().getName()), (BoundingBox) search);
        SimpleFeatureCollection candidates = index.subCollection(bBox);

        double mindist = Double.POSITIVE_INFINITY; // can't use
                                                    // MAX_Search_dist here
                                                    // as it is degrees and
                                                    // dists are meters
        Coordinate mindistPoint = null;
        double dist = 0;
        Point dest = null;
        SimpleFeatureIterator itr = candidates.features();
        CoordinateReferenceSystem crs = DefaultGeographicCRS.wgs84;
        try {
            SimpleFeature feature = null;
            while (itr.hasNext()) {
                feature = itr.next();

                // destination point
                dest = (Point) feature.getDefaultGeometry();
                GeodeticCalculator gc = new GeodeticCalculator(crs);
                gc.setStartingPosition(JTS.toDirectPosition(p.getCoordinate(), crs));
                gc.setDestinationPosition(JTS.toDirectPosition(dest.getCoordinate(), crs));
                // Calculate distance between points
                dist = gc.getorthodromicdistance();
                // System.out.println(feature.getID()+": "+dist);
                if (dist < mindist) {
                    mindist = dist;
                    mindistPoint = dest.getCoordinate();
                    lastMatched = feature;
                }
            }

        } finally {
            itr.close();
        }
        Point ret = null;

        if (mindistPoint == null) {
            searchdist *= 2.0;
            System.out.println("repeat search");
        } else {
            ret = gf.createPoint(mindistPoint);
            return ret;
        }
    }
    return gf.createPoint(new Coordinate());
}

相关文章

https://www.osgeo.cn/qgis-tutorial/overview.html https:...
设计方案是工程建设最关键的环节,也是影响城市规划的基本因...
BIM与GIS的区别与联系http://www.bimcn.org/cjwt/2018111516...
成功有感之给年轻人的10个忠告1、努力工作要努力,随随便便过...
鉴于陆地多边形为ShapelyMultiPolygon,我想找到代表例如多边...
背景与宣言传统的GISC/S开发已经很被别人不屑了,在时代的洪...