2008-11-29 2 views
4

Какой самый лучший способ, чтобы получить функцию, как следующие работы:Получение всех почтовых индексов в пределах радиуса п миль

def getNearest(zipCode, miles): 

То есть, учитывая почтовый индекс (07024) и радиус, вернуть все Почтовые индексы, которые находятся в пределах этого радиуса?

ответ

7

Существует проект на SourceForge, которые могли бы помочь с этим:

http://sourceforge.net/projects/zips/

Это дает вам базу данных с почтовыми индексами и их широта/долгота, а также кодирования примеров того, как рассчитать расстояние между двумя наборами координат. Вероятно, есть лучший способ сделать это, но вы могли бы получить функцию zipcode и ее координаты, а затем пройти через каждый zipcode в списке и добавить zipcode в список, если он попадает в указанное количество миль.

3

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

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

Альтернативный подход, который я использовал, состоит в том, чтобы построить ящик, который охватывает круг, который вы хотите, запросив предложение inter на lon/lat и затем сделав большой круг в коде приложения.

0

Возможно, это может помочь. Однако проект сконфигурирован в километрах. Вы можете изменить их в CityDAO.java

public List<City> findCityInRange(GeoPoint geoPoint, double distance) { 
    List<City> cities = new ArrayList<City>(); 
    QueryBuilder queryBuilder = geoDistanceQuery("geoPoint") 
      .point(geoPoint.getLat(), geoPoint.getLon()) 
      //.distance(distance, DistanceUnit.KILOMETERS) original 
      .distance(distance, DistanceUnit.MILES) 
      .optimizeBbox("memory") 
      .geoDistance(GeoDistance.ARC); 

    SearchRequestBuilder builder = esClient.getClient() 
      .prepareSearch(INDEX) 
      .setTypes("city") 
      .setSearchType(SearchType.QUERY_THEN_FETCH) 
      .setScroll(new TimeValue(60000)) 
      .setSize(100).setExplain(true) 
      .setPostFilter(queryBuilder) 
      .addSort(SortBuilders.geoDistanceSort("geoPoint") 
        .order(SortOrder.ASC) 
        .point(geoPoint.getLat(), geoPoint.getLon()) 
        //.unit(DistanceUnit.KILOMETERS)); Original 
        .unit(DistanceUnit.MILES)); 

    SearchResponse response = builder 
      .execute() 
      .actionGet(); 


    SearchHit[] hits = response.getHits().getHits(); 

    scroll: 
    while (true) { 

     for (SearchHit hit : hits) { 
      Map<String, Object> result = hit.getSource(); 
      cities.add(mapper.convertValue(result, City.class)); 
     } 

     response = esClient.getClient().prepareSearchScroll(response.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); 
     if (response.getHits().getHits().length == 0) { 
      break scroll; 
     } 
    } 

    return cities; 
} 

"LocationFinder \ SRC \ главная \ ресурсы \ JSON \ cities.json" файл содержит все города из Бельгии. Вы также можете удалить или создать записи, если хотите. Пока вы не меняете имена и/или структуру, никаких изменений кода не требуется.

Обязательно прочтите README https://github.com/GlennVanSchil/LocationFinder