2009-05-27 8 views
4

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

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

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

Спасибо! -Dan

+0

«Не обязательно быть точным», я бы предположил, что он не должен учитывать кривую земли? это звучит как очень трудная задача решить без грубой силы, заставляющей ее (проверяя каждую строку) ... удачи – jlarson

+0

Исправить. Не нужно учитывать кривизну земли, по крайней мере, в каком-либо значимом смысле. – DanM

ответ

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; 
+0

это может быть улучшено только с учетом состояния, в котором точка находится внутри, используя запрос содержит запрос, чтобы вернуть только одно состояние. –

1

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

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

2

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