获取半径n英里范围内的所有邮政编码

时间:2008-11-29 01:14:27

标签: location geography zipcode

获得如下功能的最佳方法是什么:

def getNearest(zipCode, miles):

也就是说,给定一个邮政编码(07024)和一个半径,返回该半径范围内的所有邮政编码?

3 个答案:

答案 0 :(得分:7)

SourceForge上有一个项目可以帮助解决这个问题:

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

它为您提供了一个包含邮政编码及其纬度/经度的数据库,以及如何计算两组坐标之间距离的编码示例。可能有更好的方法,但您可以让您的函数检索邮政编码及其坐标,然后逐步浏览列表中的每个邮政编码,并将邮政编码添加到列表中,如果它符合指定的里程数。 / p>

答案 1 :(得分:3)

如果您希望这一点准确,则必须从包含每个邮政编码的位置和形状的多边形数据开始。我有一个像这样的数据库(曾经由美国人口普查公布,但他们不再那样做了)并在它上面建了类似的东西,但没有那个确切的要求。

如果你不关心完全(我猜你没有),你可以得到一张由{{3}排序的邮政编码中心点和查询点的表格。距离。 great circle为此提供了很好的工具,尽管您可以针对将执行类似任务的其他数据库构建查询。

我使用的另一种方法是构建一个包含所需圆圈的框,在lon / lat上查询between子句,然后在应用程序代码中执行大圆。

答案 2 :(得分:0)

也许这会有所帮助。该项目配置为公里。您可以在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”文件包含来自比利时的所有城市。您也可以删除或创建条目。只要您不更改名称和/或结构,就不需要更改代码。

请务必阅读自述文件https://github.com/GlennVanSchil/LocationFinder