Java 确定地理点是否在州边界的X米范围内(使用shapefile作为边界数据)

Java 确定地理点是否在州边界的X米范围内(使用shapefile作为边界数据),java,maps,geospatial,geography,geotools,Java,Maps,Geospatial,Geography,Geotools,所以我正在编写一个Java应用程序,我有一个ESRI形状文件,它包含了美国所有州的边界。我需要的是能够确定任何给定的lat/lon点是否在任何州边界线的指定距离内-即,我不会指定特定的边界线,只需要查看该点是否靠近其中任何一个 解决方案根本不需要非常精确;e、 g.我不需要处理垂直于边界的测量,或其他任何问题。只要看看向北、向南、向东或向西走X米是否会导致跨越边界就足够了。解决方案必须是计算效率高的,因为我将执行大量的计算 我计划将GeoTools库(尽管如果有更简单的选项,我完全支持)与Sha

所以我正在编写一个Java应用程序,我有一个ESRI形状文件,它包含了美国所有州的边界。我需要的是能够确定任何给定的lat/lon点是否在任何州边界线的指定距离内-即,我不会指定特定的边界线,只需要查看该点是否靠近其中任何一个

解决方案根本不需要非常精确;e、 g.我不需要处理垂直于边界的测量,或其他任何问题。只要看看向北、向南、向东或向西走X米是否会导致跨越边界就足够了。解决方案必须是计算效率高的,因为我将执行大量的计算

我计划将GeoTools库(尽管如果有更简单的选项,我完全支持)与Shapefile插件一起使用。我真正不明白的是:一旦我将shapefile加载到内存中,如何检查我是否靠近边界

谢谢!
-Dan

如果你能从shapefile中提取出每个状态的形状,创建一个边长x米的封套(你的点在确切的中心),看看这两个形状是否相交,你就能回答这个问题

如果我使用的是ESRI的ArcGIS引擎,我会使用一个ISpatialFilter和几何体中定义的点(可能带有缓冲区),并根据States shapefile查询该点。返回的任何结果都将表明该点接近某个状态。我不熟悉GeoTools,在浏览他们的文档时,我没有发现任何类似于这种功能的东西,但他们一定拥有它。您可能需要查找如何使用GeoTools对ShapeFile执行空间查询的示例。

假设GeoTools中包含的几何图形:

public boolean pointIsClose( File file, Point targetPoint,double distance) {


  boolean ret = false;
  Map connect = new HashMap();
  connect.put("url", file.toURL());
  DataStore dataStore = DataStoreFinder.getDataStore(connect);


  FeatureSource featureSource = dataStore.getFeatureSource(typeName);
  FeatureCollection collection = featureSource.getFeatures();
  FeatureIterator iterator = collection.features();



  try {
    while (iterator.hasNext()) {
      Feature feature = iterator.next();
      Geometry sourceGeometry = feature.getDefaultGeometry();
      ret= sourceGeometry.isWithinDistance(targetPoint, distance );
    }
  } finally {
    iterator.close();
  }
  return ret;
}
双倍数字必须来自定义将执行计算的单位的

以下是geotools导入:

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.feature.Feature;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

如果您只想知道点A是否在状态边界的X米范围内,并且X是常数,而不关心它是哪个边界,则可以将负空间作为一系列框进行预计算。然后,您所要做的就是针对该点对每个框进行包含检查。如果它们都不匹配,你就不在负空间

考虑到“不必非常精确”,我假设它不必考虑地球的曲线?这听起来像是一个很难解决的问题,不需要强制执行(检查每一行)。。。祝你好运。不必考虑地球的曲率,至少在任何有意义的意义上都不必考虑。这可以通过使用contains查询仅返回一个状态来改进,只需考虑点所在的状态。