寻找最近的点(几何点)

4

当我有一个几何点时,我希望计算距离起始点(参考点)最近的点。

为此,我使用ports.shp文件。

这段代码大部分时间都能正常运行。但是有时会返回null minDistPoint is null。 我不确定该用什么值来初始化minDist

public Point findNearestPoint( Point p, SimpleFeatureCollection features ) throws FactoryException, TransformException {
   Point destination = null;
   double minDist = 10.0e+6;
   double distance = 0;
   Point minDistPoint = null;
   try( SimpleFeatureIterator itr = features.features()) {
      while( itr.hasNext()) {
         SimpleFeature feature = itr.next();
         final String EPSG4326 =
            "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\","+
            "SPHEROID[\"WGS 84\",6378137,298.257223563,"+
            "AUTHORITY[\"EPSG\",\"7030\"]],"+
            "AUTHORITY[\"EPSG\",\"6326\"]]," + 
            "PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],"+
            "UNIT[\"degree\", " +"0.01745329251994328,"+
            "AUTHORITY[\"EPSG\",\"9122\"]],"+
            "AUTHORITY[\"EPSG\",\"4326\"]]";
         CoordinateReferenceSystem crs = CRS.parseWKT(EPSG4326);    
         destination = (Point) feature.getDefaultGeometry(); 
         GeodeticCalculator gc = new GeodeticCalculator(crs); 
         gc.setStartingPosition(
            JTS.toDirectPosition( p.getCoordinate(), crs));
         gc.setDestinationPosition(
            JTS.toDirectPosition( dest.getCoordinate(), crs));
         distance = gc.getOrthodromicDistance();
         if( distance < minDist ) {
            minDist = distance;
            minDistPoint = destination;
            lastMatched = feature;
         }
      }
   }
   int totalmeters = (int) minDist;
   int km = totalmeters / 1000;
   int meters = totalmeters - (km * 1000);
   float remaining_cm = (float) (minDist - totalmeters) * 10000;
   remaining_cm = Math.round(remaining_cm);
   float cm = remaining_cm / 100;
   System.out.println(
      "Distance = " + km + "km " + meters + "m " + cm + "cm");
   if( minDistPoint == null ) {
      return null;
   }
   return minDistPoint;
}

1
您可以尝试使用Double.POSITIVE_INFINITY,这将使您确保至少第一次满足if条件。 - bracco23
@bracco23:看起来运行良好,谢谢!请将其作为答案。 - George
2个回答

1

在寻找最小值的每个算法中,您应该始终将初始值设置为集合中的第一个或可实现的最大值。

在您的情况下,由于您使用的是双精度浮点数,您可以使用Double.POSITIVE_INFINITY作为初始值,这将确保至少第一次if条件为真。


0
计算机科学的答案在评论中给出,Double.PositiveInfinity比任何数字都大。 地理空间的答案是,在球体上,没有两个点之间的距离超过pi*r。对于地球来说,一个很好的上限是3.14*6400公里。 使用正无穷。

2 * pi * R 是周长,两点之间的最大距离是其一半。你永远不需要绕地球走超过一半的路程。 - Meir Maor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接