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

Итак, я пишу приложение на Java, и у меня есть шейп-файл ESRI, который содержит границы всех штатов США. Мне нужно уметь определить, находится ли какая-либо конкретная точка широты / долготы на указанном расстоянии от ЛЮБОЙ линии государственной границы, т. Е. Я не буду указывать конкретную границу, просто нужно посмотреть, точка близка к любым из них.

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

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

Спасибо! * 1011 Дан *

Ответы [ 3 ]

7 голосов
/ 27 мая 2009

Предполагая 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;
2 голосов
/ 28 мая 2009

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

1 голос
/ 27 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...