Получение всех почтовых индексов в радиусе n миль - PullRequest
4 голосов
/ 29 ноября 2008

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

def getNearest(zipCode, miles):

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

Ответы [ 3 ]

7 голосов
/ 29 ноября 2008

На SourceForge существует проект, который может помочь с этим:

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

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

3 голосов
/ 29 ноября 2008

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

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

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

0 голосов
/ 01 июня 2016

Может быть, это может помочь. Проект настроен в километрах, хотя. Вы можете изменить их в 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 \ main \ resources \ json \ towns.json" содержит все города из Бельгии. Вы можете удалить или создать записи, если вы тоже хотите. Пока вы не измените имена и / или структуру, никакие изменения кода не требуются.

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

...