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

时间:2009-05-27 19:08:42

标签: java maps geospatial geography geotools

所以我正在编写一个Java应用程序,我有一个ESRI Shapefile,其中包含所有美国州的边界。我需要的是能够确定任何给定的纬度/经度点是否在任何状态边界线的指定距离内 - 即,我指定特定的边界线,只需要看到该点是否接近任何

解决方案根本不必非常精确;例如我不需要处理垂直于边界的测量,或者其他什么。只是检查是否向北,向南,向东或向西X米将导致越过边界将是绰绰有余。解决方案必须具有计算效率,因为我将执行大量的这些计算。

我打算使用Shapefile插件来使用GeoTools库(尽管有一个更简单的选项,我就是全部用它)。我真正理解的是:一旦我将shapefile加载到内存中,我该如何检查我是否接近边界?

谢谢! -Dan

3 个答案:

答案 0 :(得分:7)

假设几何体JTS是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;
}

双号必须来自CRS,它将定义执行计算的单位。

这些是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;

答案 1 :(得分:2)

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

答案 2 :(得分:1)

如果你能以某种方式从shapefile中提取每个状态的形状,创建一个边长x米的信封(你的点在正中心)并看看这两个形状是否相交,你将能够回答这个问题。

如果我使用的是ESRI的ArcGIS Engine,我会使用ISpatialFilter和几何中定义的点(可能带有缓冲区),并根据States shapefile查询。返回的任何结果都表明该点接近某个州。我不熟悉GeoTools,在浏览他们的文档时,我没有看到任何类似功能的东西,但他们必须拥有它。您可能希望查找有关如何使用GeoTools对shapefile执行空间查询的示例。