什麼是得到這樣一個功能的最佳方式以下工作:獲得正英里半徑內的所有郵政編碼
def getNearest(zipCode, miles):
也就是說,給出一個郵政編碼(07024)和半徑,返回的所有郵編其在那個半徑內?
什麼是得到這樣一個功能的最佳方式以下工作:獲得正英里半徑內的所有郵政編碼
def getNearest(zipCode, miles):
也就是說,給出一個郵政編碼(07024)和半徑,返回的所有郵編其在那個半徑內?
有在SourceForge上的一個項目,可以幫助此:
http://sourceforge.net/projects/zips/
它爲您提供了郵政編碼和它們的緯度/經度數據庫,以及如何計算距離編碼示例在兩組座標之間。可能有更好的辦法,但你可以讓你的功能檢索郵政編碼及其座標,然後遍歷列表中的每個郵政編碼,並將郵政編碼添加到列表中,如果郵政編碼落在指定的英里數內。
如果你想這是準確的,你必須從多邊形數據開始,包括每個郵政編碼的位置和形狀。我有一個這樣的數據庫(過去由美國人口普查公佈,但他們不再這樣做),並在其上面建立了類似的東西,但沒有確切的要求。
如果你不關心是確切(我猜你沒有),你可以得到由great circle距離排序拉鍊碼和查詢點的中心點表。 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;
}
的 「LocationFinder的\ src \主\資源\ JSON \ cities.json」 文件包含來自比利時的所有城市。如果您想要,也可以刪除或創建條目。只要您不更改名稱和/或結構,就不需要更改代碼。