Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找最近的点(几何图形点)_Java_Gis_Geotools - Fatal编程技术网

Java 查找最近的点(几何图形点)

Java 查找最近的点(几何图形点),java,gis,geotools,Java,Gis,Geotools,当我有几何图形点时,我想从起点(参考)计算最近的点 出于这个原因,我正在使用ports.shp文件 代码大部分时间都在工作。但有时它返回nullminDistPoint is null。我不确定用什么值初始化Mindsist public Point findNearestPoint( Point p, SimpleFeatureCollection features ) throws FactoryException, TransformException { Point destina

当我有几何图形
时,我想从起点(参考)计算最近的点

出于这个原因,我正在使用ports.shp文件

代码大部分时间都在工作。但有时它返回null
minDistPoint is null
。我不确定用什么值初始化Mindsist

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;
}
公共点findNearestPoint(点p,SimpleFeatureCollection功能)抛出FactoryException、TransformException{
点目的地=空;
双重正念=10.0e+6;
双倍距离=0;
Point minDistPoint=null;
try(SimpleFeatureIterator itr=features.features()){
while(itr.hasNext()){
SimpleFeature feature=itr.next();
最终字符串EPSG4326=
“全球地质观测系统[\'WGS 84\',基准[\'WGS\ U 1984\'”+
“球体[\'WGS 84\',6378137298.257223563,”+
“授权[\'EPSG\',\'7030\'],”+
“授权[\'EPSG\',\'6326\'],”+
“PRIMEM[\'Greenwich\',0,权威[\'EPSG\',\'8901\'],”+
“单位[\'degree\”,“+0.01745329251994328,”+
“授权[\'EPSG\',\'9122\'],”+
“授权[\'EPSG\',\'4326\']”;
坐标参考系crs=crs.parseWKT(EPSG4326);
destination=(点)feature.getDefaultGeometry();
大地测量计算器gc=新的大地测量计算器(crs);
gc.setStartingPosition(
JTS.toDirectPosition(p.getCoordinate(),crs));
gc.setDestinationPosition(
JTS.toDirectPosition(dest.getCoordinate(),crs));
距离=gc.getOrthodromicDistance();
如果(距离<心智){
心灵主义者=距离;
minDistPoint=目的地;
最后匹配=特征;
}
}
}
整数总计=(整数)心智主义者;
int km=总仪表/1000;
整数米=总米-(km*1000);
浮动剩余_cm=(浮动)(Minist-totalmeters)*10000;
剩余厘米=数学圆(剩余厘米);
浮动厘米=剩余的厘米/100;
System.out.println(
“距离=”+km+“km”+米+“m”+cm+“cm”);
if(minDistPoint==null){
返回null;
}
返回思维点;
}

对于每一种求最小值的算法,应始终将初始值设置为集合中的第一个或可达到的最大值


在您的情况下,由于您使用的是double,因此可以使用
double.POSITIVE _∞
作为初始值,这将允许您确保至少第一次
if
条件为真。

计算机科学答案在注释中给出,double.PositiveInfinity大于任何数字。 地理空间的答案是,在球体上,没有两个点的间距超过π*r。对于行星地球来说,goood的上限是3.14*6400公里。
使用正无穷大。

您可以尝试使用
Double.positive_infinity
,这将允许您确保至少在第一次
if
条件为真。@bracco23:它似乎工作正常,谢谢!请回答。2*pi*R是周长,两点之间的最大距离是周长的一半。你永远不需要环游世界超过一半。