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

StackOverflow https://stackoverflow.com/questions/917484

Вопрос

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

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

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

Спасибо!-Dan

Это было полезно?

Решение

Предполагая СТС для геометрии, которая включена в 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;

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top