Определение того, находится ли географическая точка в пределах X метров от государственной границы (использование шейп-файла для пограничных данных)


Итак, я пишу приложение Java, и у меня есть Шейп-файл ESRI, который содержит границы всех штатов США. Что мне нужно, так это быть в состоянии определить, находится ли какая - либо заданная точка lat/lon на определенном расстоянии от любой линии государственной границы-то есть, я не буду указывать конкретную линию границы, просто нужно увидеть, находится ли эта точка близко к Любой из них.

Решение не должно быть очень точным вообще; например, мне не нужно иметь дело с измерением перпендикулярно границе, или что там еще. Просто проверить, не приведет ли перемещение на X метров на север, юг, восток или запад к пересечению границы, было бы более чем достаточно. Решение должно быть вычислительно эффективным, так как я буду выполнять огромное количество этих вычислений.

Я планирую использовать библиотеку GeoTools (хотя если есть более простой вариант, я полностью за него) с плагином Шейп-файлов. Чего я на самом деле не понимаю, так это: как только я загрузил шейп-файл в память, как мне проверить, не нахожусь ли я рядом с границей?

Спасибо! - Дан

3 4

3 ответа:

Предполагая 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 , которые будут определять единицы, в которых будет выполняться вычисление.

Это импорт геотулов:

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;

Если вы просто хотите знать, находится ли точка а в пределах X метров от государственной границы, и X является постоянной, и вам все равно, какая это граница, вы можете предварительно вычислить отрицательное пространство в виде ряда коробок. Тогда все, что вам нужно сделать, это проверить содержит для каждого из этих ящиков против точки. Если ни один из них не совпадает, вы не находитесь в отрицательном пространстве.

Если вы можете каким-то образом извлечь форму для каждого состояния из шейп-файла, создать огибающую, которая будет x метров на стороне (с вашей точкой в точном центре) и посмотреть, пересекаются ли эти две формы, вы сможете ответить на вопрос.

Если бы я использовал движок ArcGIS ESRI, я бы использовал ISpatialFilter с точкой, определенной в геометрии(возможно, с буфером), и запросил бы ее у шейп-файла состояний. Любой возвращенный результат(ы) будет означать, что точка находится вблизи состояния. Я незнакомый с GeoTools, и, просматривая их документацию, я не наткнулся ни на что похожее на этот тип функциональности, но они должны иметь его. Возможно, вы захотите посмотреть примеры использования GeoTools для выполнения пространственных запросов к шейп-файлам.