Pergunta

Qual é a melhor maneira de obter uma função como a seguinte ao trabalho:

def getNearest(zipCode, miles):

Isto é, dado um CEP (07024) e um raio, devolver todos os códigos postais que estão dentro desse raio?

Foi útil?

Solução

Há um projeto no SourceForge que poderia ajudar com isso:

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

Ela dá-lhe uma base de dados com códigos postais e sua latitude / longitude, bem como exemplos de codificação de como calcular a distância entre dois conjuntos de coordenadas. Há provavelmente uma maneira melhor de fazer isso, mas você poderia ter sua função de recuperar o CEP e as suas coordenadas, e depois passo através de cada código postal na lista e adicione o código postal para uma lista se ele cai dentro do número de milhas especificado.

Outras dicas

Se você quer que isso seja preciso, você deve começar com dados polígono que inclui a localização e forma de cada CEP. Eu tenho um banco de dados como este (usado para ser publicado pelo censo dos Estados Unidos, mas eles já não fazer isso) e ter construído coisas semelhantes em cima dele, mas não esse pedido exato.

Se você não se importa em ser exata (que eu estou supondo que você não), você pode obter uma tabela de pontos centrais de zipcodes e pontos de consulta ordenados por grande círculo distância. PostGIS fornece excelentes ferramentas para fazer isso, mas você pode construir uma consulta em relação a outros bancos de dados que executam tarefas semelhantes.

Uma abordagem alternativa que usei é construir uma caixa que inclui o círculo que você quer, a consulta com um entre cláusula sobre lon / lat e, em seguida, fazendo o grande-círculo no código do aplicativo.

Talvez isso possa ajudar. O projeto está configurado em quilómetros embora. Você pode modificar estes em 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;
}

O "LocationFinder \ src \ Main \ resources \ json \ cities.json" arquivo contém todas as cidades da Bélgica. Você pode apagar ou criar entradas se você quiser também. Contanto que você não altere os nomes e / ou estrutura, sem alterações de código são necessários.

Certifique-se de ler o README https://github.com/GlennVanSchil/LocationFinder

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top