Domanda

Qual è il modo migliore per far funzionare una funzione come la seguente:

def getNearest(zipCode, miles):

Cioè, dato un codice postale (07024) e un raggio, restituire tutti i codici postali che si trovano in quel raggio?

È stato utile?

Soluzione

Esiste un progetto su SourceForge che potrebbe aiutare con questo:

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

Ti offre un database con i codici postali e la loro latitudine / longitudine, nonché esempi di codifica su come calcolare la distanza tra due serie di coordinate. Probabilmente esiste un modo migliore per farlo, ma potresti avere la tua funzione di recuperare il codice postale e le sue coordinate, quindi scorrere ciascun codice postale nell'elenco e aggiungere il codice postale a un elenco se rientra nel numero di miglia specificato.

Altri suggerimenti

Se vuoi che questo sia accurato, devi iniziare con i dati poligonali che includono la posizione e la forma di ogni codice postale. Ho un database come questo (usato per essere pubblicato dal censimento degli Stati Uniti, ma non lo fanno più) e ho costruito cose simili sopra di esso, ma non quella richiesta esatta.

Se non ti interessa essere esatto (cosa che suppongo tu non faccia), puoi ottenere una tabella di punti centrali di codici postali e punti di query ordinati per grande cerchio distanza. PostGIS fornisce ottimi strumenti per farlo, anche se è possibile costruire una query su altri database che eseguiranno attività simili.

Un approccio alternativo che ho usato è quello di costruire un riquadro che racchiuda il cerchio desiderato, eseguendo una query con una clausola Between su lon / lat e quindi eseguendo il cerchio grande nel codice dell'app.

Forse questo può aiutare. Il progetto è configurato in chilometri però. Puoi modificarli in 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;
}

Il " LocationFinder \ src \ main \ resources \ json \ cities.json " il file contiene tutte le città del Belgio. Se lo desideri, puoi eliminare o creare voci. Finché non si modificano i nomi e / o la struttura, non sono necessarie modifiche al codice.

Assicurati di leggere il README https://github.com/GlennVanSchil/LocationFinder

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top