Frage

Was ist der beste Weg, um eine Funktion wie folgt an der Arbeit zu bekommen:

def getNearest(zipCode, miles):

Das heißt, ein zipcode (07024) und einen Radius gegeben wird, lege alle zipcodes, die innerhalb dieses Umkreises sind?

War es hilfreich?

Lösung

Es gibt ein Projekt auf Source, die dabei behilflich sein könnte:

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

Es gibt Ihnen eine Datenbank mit Postleitzahlen und deren Breite / Länge, sowie Codierung Beispiele dafür, wie der Abstand zwischen zwei Sätzen von Koordinaten zu berechnen. Es gibt wahrscheinlich einen besseren Weg, es zu tun, aber man könnte Ihre Funktion die zipcode und seine Koordinaten, abrufen und dann durch jede zipcode in der Liste Schritt und die zipcode zu einer Liste hinzufügen, wenn es innerhalb der Anzahl der Meilen fällt angegeben.

Andere Tipps

Wenn Sie dies genau sein wollen, müssen Sie mit Polygondaten starten, die die Position und Form jeder zipcode enthält. Ich habe eine Datenbank wie folgt aus (verwendet von der US-Volkszählung veröffentlicht werden, aber sie nicht mehr tun) und haben ähnliche Dinge oben auf gebaut, aber nicht so genaue Anfrage.

Wenn Sie nicht über das Sein genau egal (was ich vermute, Sie nicht), können Sie eine Tabelle von Mittelpunkten von zipcodes und Abfrage Punkte können durch Großkreis Abstand. PostGIS bietet großartige Werkzeuge, dies zu tun, auch wenn Sie eine Abfrage gegen andere Datenbanken konstruieren können, die ähnliche Aufgaben ausführen wird.

Ein alternativer Ansatz, den ich verwendet habe, ist eine Box zu konstruieren, die den Kreis Sie wollen umfasst, mit einem auf lon / lat zwischen Klausel abfragt und dann den Großkreis in App-Code zu tun.

Vielleicht kann dabei helfen. Das Projekt wird jedoch in Kilometern konfiguriert. Sie können diese in CityDAO.java ändern

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;
}

Die "Locationfinder \ src \ main \ resources \ json \ cities.json" Datei, die alle Städte aus Belgien enthält. Sie können Einträge löschen oder erstellen, wenn Sie zu wollen. Solange Sie die Namen nicht ändern und / oder Struktur werden keine Code-Änderungen erforderlich.

Achten Sie auf die Readme https://github.com/GlennVanSchil/LocationFinder

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top