次のような関数を機能させるための最良の方法は何ですか:
def getNearest(zipCode, miles):
つまり、郵便番号 (07024) と半径を指定すると、その半径内にあるすべての郵便番号が返されますか?
これを支援できる SourceForge のプロジェクトがあります。
http://sourceforge.net/projects/zips/
郵便番号とその緯度/経度を含むデータベースと、2 組の座標間の距離を計算する方法のコーディング例を提供します。おそらくもっと良い方法がありますが、関数で郵便番号とその座標を取得し、リスト内の各郵便番号をステップ実行して、指定されたマイル数内にある場合は郵便番号をリストに追加することができます。
これを正確に行うには、すべての郵便番号の位置と形状を含むポリゴン データから始める必要があります。私はこのようなデータベースを持っており (以前は米国の国勢調査によって公開されていましたが、現在は公開されていません)、その上に同様のものを構築しましたが、正確な要求ではありません。
正確であることを気にしない場合(気にしないと思います)、郵便番号の中心点と大圏距離で並べられたクエリ ポイントのテーブルを取得できます。 PostGISはこれを行うための優れたツールを提供しますが、同様のタスクを実行する他のデータベースに対してクエリを作成することもできます。
私が使用した代替アプローチは、必要な円を囲むボックスを作成し、経度/緯度の 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;
}
"LocationFinder\src\main\resources\json\cities.json" ファイルには、ベルギーのすべての都市が含まれています。必要に応じて、エントリを削除または作成することもできます。名前や構造を変更しない限り、コードを変更する必要はありません。
README https://github.com/GlennVanSchil/LocationFinderを必ずお読みください。