Question

Quel est le meilleur moyen de faire fonctionner une fonction comme celle-ci:

def getNearest(zipCode, miles):

C’est-à-dire qu’avec un code postal (07024) et un rayon, renvoyer tous les codes postaux qui se trouvent dans ce rayon?

Était-ce utile?

La solution

Il existe un projet sur SourceForge qui pourrait vous aider:

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

Il vous donne une base de données avec les codes postaux et leur latitude / longitude, ainsi que des exemples de code sur la façon de calculer la distance entre deux ensembles de coordonnées. Il existe probablement un meilleur moyen de le faire, mais vous pouvez demander à votre fonction de récupérer le code postal et ses coordonnées, puis de parcourir chaque code postal de la liste et de l'ajouter à une liste si elle correspond au nombre de miles spécifié.

Autres conseils

Si vous voulez que cela soit précis, vous devez commencer par des données de polygone comprenant l'emplacement et la forme de chaque code postal. J'ai une base de données comme celle-ci (qui était autrefois publiée par le recensement américain, mais ils ne le font plus) et j'ai construit des choses similaires au-dessus, mais pas cette requête exacte.

Si vous ne vous souciez pas d'être exact (ce que je suppose, ce n'est pas le cas), vous pouvez obtenir un tableau des points centraux des codes postaux et des points de requête classés par grand cercle distance. PostGIS fournit d'excellents outils pour ce faire, bien que vous puissiez créer une requête contre d'autres bases de données exécutant des tâches similaires.

Une autre approche que j'ai utilisée consiste à construire une boîte englobant le cercle souhaité, en interrogeant une clause between sur lon / lat, puis en faisant le grand cercle dans le code d'application.

Peut-être que cela peut aider. Le projet est configuré en kilomètres cependant. Vous pouvez les modifier dans 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;
}

Le " LocationFinder \ src \ main \ resources \ json \ cities.json " Ce fichier contient toutes les villes de Belgique. Vous pouvez également supprimer ou créer des entrées si vous le souhaitez. Tant que vous ne modifiez pas les noms et / ou la structure, aucun changement de code n'est requis.

Assurez-vous de lire le fichier README https://github.com/GlennVanSchil/LocationFinder

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top