获得正英里半径内的所有邮政编码
问题描述:
什么是得到这样一个功能的最佳方式以下工作:获得正英里半径内的所有邮政编码
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” 文件包含来自比利时的所有城市。如果您想要,也可以删除或创建条目。只要您不更改名称和/或结构,就不需要更改代码。