当前位置: 首页 > 面试题库 >

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

姚鹤龄
2023-03-14
问题内容

我想根据自然地球数据计算一个点到一个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(?????));

我有features从加载文件,但它没有任何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());
}


 类似资料:
  • 问题内容: 我有一个文本文件,如下所示 我想计算两个α碳原子之间的距离,即计算第一个和第二个原子之间的距离,然后计算第二个和第三个原子之间的距离,依此类推.....两个原子之间的距离可以表示为: 7,8和9列分别代表x,y和z坐标。我需要打印距离和对应的残基对(第4列),如下所示(距离的值不是实数) 如何使用Perl或python进行此计算? 问题答案: 如果您的数据用空格隔开,那么简单就可以完成

  • 本文向大家介绍php两点地理坐标距离的计算方法,包括了php两点地理坐标距离的计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两点地理坐标距离的具体代码,供大家参考,具体内容如下 功能:根据圆周率和地球半径系数与两点坐标的经纬度,计算两点之间的球面距离。 获取两点坐标距离: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍php如何计算两坐标点之间的距离,包括了php如何计算两坐标点之间的距离的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两坐标点之间距离的实现代码,供大家参考,具体内容如下 地球上两个点之间,可近可远。 当比较近的时候,可以忽略球面因素,当做是一个平面,这样就有了两种计算方法。 小编再为大家分享一段php坐标之间距离的求解代码: 以上就是本文的全部内容,希望对

  • 本文向大家介绍java实现计算地理坐标之间的距离,包括了java实现计算地理坐标之间的距离的使用技巧和注意事项,需要的朋友参考一下 java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 以上就是本文的全部内容了,希望大家能够喜欢。

  • 我一直在寻找一种解决方案来转换笛卡尔坐标(lat, long),我必须极坐标以促进我想要运行的模拟,但我在这里没有找到任何问题或答案。有很多选项,包括Matlab中的内置函数cart2pol,但我所有的数据都在R中,我想继续在这个框架中舒适地工作。 问题: 我有来自标记数据的lat/long坐标,我想将这些转换为极坐标(意味着跳跃大小和角度:http://en.wikipedia.org/wiki

  • 档案员。txt包含两类员工的详细信息,即月薪和小时津贴。如果是月薪员工,则该文件包含名字、姓氏、性别、职级、类型和基本工资,如果是小时薪员工,则包含小时工资和工作小时数。该文件的示例如下所示: 约翰·史密斯M经理每月45000.00 Sunil Bates M高级每小时700.00 45 梁爱娃F警官每月30500.00 我要写一个程序,会看每个员工,计算奖金占基本工资的百分比,对于一个按小时计酬