Pregunta

¿Cuál es la mejor manera de hacer que una función como la siguiente funcione?

def getNearest(zipCode, miles):

Es decir, dado un código postal (07024) y un radio, ¿devuelve todos los códigos postales que están dentro de ese radio?

¿Fue útil?

Solución

Hay un proyecto en SourceForge que podría ayudar con esto:

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

Le proporciona una base de datos con códigos postales y su latitud / longitud, así como ejemplos de codificación de cómo calcular la distancia entre dos conjuntos de coordenadas. Probablemente haya una mejor manera de hacerlo, pero podría hacer que su función recupere el código postal y sus coordenadas, y luego recorra cada código postal en la lista y agregue el código postal a una lista si cae dentro del número de millas especificado.

Otros consejos

Si desea que esto sea preciso, debe comenzar con datos de polígonos que incluyan la ubicación y la forma de cada código postal. Tengo una base de datos como esta (solía ser publicada por el censo de EE. UU., Pero ya no lo hacen) y he construido cosas similares encima, pero no esa solicitud exacta.

Si no le importa ser exacto (lo cual supongo que no), puede obtener una tabla de puntos centrales de códigos postales y puntos de consulta ordenados por gran círculo distancia. PostGIS proporciona excelentes herramientas para hacerlo, aunque puede construir una consulta en otras bases de datos que realizarán tareas similares.

Un enfoque alternativo que he usado es construir un cuadro que abarque el círculo que desee, consultando con una cláusula between en lon / lat y luego haciendo el gran círculo en el código de la aplicación.

Quizás esto pueda ayudar. Sin embargo, el proyecto está configurado en kilómetros. Puede modificarlos en 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;
}

El " LocationFinder \ src \ main \ resources \ json \ cities.json " El archivo contiene todas las ciudades de Bélgica. Puede eliminar o crear entradas si lo desea también. Mientras no cambie los nombres y / o la estructura, no se requieren cambios de código.

Asegúrese de leer el archivo README https://github.com/GlennVanSchil/LocationFinder

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top