【问题标题】:Getting all zip codes within an n mile radius获取n英里半径内的所有邮政编码
【发布时间】:2008-11-29 01:14:27
【问题描述】:

让如下函数工作的最佳方法是什么:

def getNearest(zipCode, miles):

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

【问题讨论】:

    标签: location geography zipcode


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      如果你不关心精确(我猜你不关心),你可以得到一个按great circle 距离排序的邮政编码中心点和查询点的表格. PostGIS 提供了很好的工具来执行此操作,尽管您可以针对将执行类似任务的其他数据库构建查询。

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

      【讨论】:

        【解决方案3】:

        也许这会有所帮助。该项目以公里为单位进行配置。您可以在 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          • 1970-01-01
          • 2014-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多