Определение того, находится ли географическая точка в пределах X метров от государственной границы (использование шейп-файла для пограничных данных)
Итак, я пишу приложение Java, и у меня есть Шейп-файл ESRI, который содержит границы всех штатов США. Что мне нужно, так это быть в состоянии определить, находится ли какая - либо заданная точка lat/lon на определенном расстоянии от любой линии государственной границы-то есть, я не буду указывать конкретную линию границы, просто нужно увидеть, находится ли эта точка близко к Любой из них.
Решение не должно быть очень точным вообще; например, мне не нужно иметь дело с измерением перпендикулярно границе, или что там еще. Просто проверить, не приведет ли перемещение на X метров на север, юг, восток или запад к пересечению границы, было бы более чем достаточно. Решение должно быть вычислительно эффективным, так как я буду выполнять огромное количество этих вычислений.
Я планирую использовать библиотеку GeoTools (хотя если есть более простой вариант, я полностью за него) с плагином Шейп-файлов. Чего я на самом деле не понимаю, так это: как только я загрузил шейп-файл в память, как мне проверить, не нахожусь ли я рядом с границей?
Спасибо! - Дан
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 для выполнения пространственных запросов к шейп-файлам.