質問

次のような関数を機能させるための最良の方法は何ですか:

def getNearest(zipCode, miles):

つまり、郵便番号(07024)と半径を指定すると、その半径内にあるすべての郵便番号が返されますか?

役に立ちましたか?

解決

これを支援できるSourceForgeのプロジェクトがあります:

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

郵便番号とその緯度/経度、および2組の座標間の距離を計算する方法のコーディング例を含むデータベースを提供します。おそらくもっと良い方法がありますが、関数に郵便番号とその座標を取得させ、リスト内の各郵便番号をステップ実行し、指定されたマイル数以内であれば郵便番号をリストに追加することができます。 / p>

他のヒント

これを正確にしたい場合は、すべての郵便番号の位置と形状を含むポリゴンデータから開始する必要があります。このようなデータベースがあり(米国国勢調査で公開されていましたが、現在は公開されていません)、その上に同様のものを構築しましたが、その正確なリクエストではありません。

正確であることを気にしない場合は(そうではないと思います)、大圏の距離。 PostGIS は、これを行うための優れたツールを提供しますが、同様のタスクを実行する他のデータベースに対してクエリを作成できます。

私が使用した別のアプローチは、希望する円を囲むボックスを作成し、lon / latのbetween句でクエリを実行し、アプリコードで大円を実行することです。

これが役立つかもしれません。ただし、プロジェクトはキロメートル単位で構成されます。これらは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;
}

&quot; LocationFinder \ src \ main \ resources \ json \ cities.json&quot;ファイルにはベルギーのすべての都市が含まれています。必要に応じて、エントリを削除または作成できます。名前や構造を変更しない限り、コードを変更する必要はありません。

README https://github.com/GlennVanSchil/LocationFinder

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top