使用Long/Lat坐标查找在另一个邮政编码半径内的列表的邮政编码/坐标


Finding ZIP codes/coordinates for listings within a radius of another ZIP code using Long/Lat coordinates

我想查找邮政编码任意半径内的所有清单。例如:距离90210 10英里,距离00603 100英里,等等。

如果我的查询是"距离90210 10英里",我想返回在这个10英里半径内的所有列表。这些列表也是邮政编码,所以我实际上想要找到这个10英里半径内的所有其他邮政编码。

我认为一旦收集了半径内的所有邮政编码,就将它们添加到一个数组中,然后使用SQL查找该数组中具有邮政编码的所有清单。然而,我不确定这是否是最好的方法。

我试着做研究,但它对我来说变得非常复杂;我想这可能和大圆有关。我也一直在http://williams.best.vwh.net/avform.htm上查看航空公式,但仍然无法解决任何问题。

我有一个邮政编码数据库,其中包含所有邮政编码的经度和纬度,以及城市和州信息。这些信息对我来说已经足够了。我想我只需要知道数学;我不想使用API。

关于如何计算这样的半径,我在这里完全迷路了。

您可以通过调用下面的api获得与输入的邮政编码对应的所有邮政编码列表:-

$zipcode=90210;
$distancekm=10;
$curl = curl_init();
   curl_setopt_array($curl, array( 
   CURLOPT_RETURNTRANSFER => 1,
   CURLOPT_URL => 
       'http://zipcodedistanceapi.redline13.com/rest/2odywUYrQJOEEO0vJdlcH5Qd8Lf6EGKG4YfBTd2JXQoCFo7pBsBiysvGdLNSsyzw/radius.json/'.$zipcode.'/'.$distancekm.'/mile'));
   $result = curl_exec($curl);
   $decoded_result = json_decode($result, true);

$decoded_result返回距离邮政编码90210近10英里的所有邮政编码。

你提到了三个独立的问题:

  • "英里"answers"地理坐标"没有直接翻译。你可能听说过,地球不是平的:-),这意味着在赤道和洛杉矶纬度的经度1度会有不同的英里值。你链接的公式,是余弦球面定律的应用它允许你以更快的近似值平移经纬度差

  • 假设你可能有很多地址,你的第二个问题是常规的MySQL索引(b -树)对于通过最近的坐标进行过滤是非常低效的。一些数据库供应商(Oracle, Postgress)有"GIS扩展",允许对地理坐标执行快速查找。虽然MySQL具有这些特定的数据类型和函数,但早期版本在范围和性能上非常有限。最新版本(5.6和5.7)在某种程度上改进了这一点,您可以在这里看到一个使用MySQL过滤坐标附近位置的示例:

    http://mysqlserverteam.com/mysql-5-7-and-gis-an-example/

    它涉及到使用一个边界框进行过滤,这使得从MySQL的功能更容易。前面的链接有一步一步的公式和查询指南

  • 您打算执行点的搜索,然后执行第二个查询来检索每个找到的位置的信息。这是不必要的,并且可能在网络带宽方面效率低下,您可以通过执行自连接(将查找特定邮政编码的表与查找地理上接近的记录连接起来)在单个查询中完成所有操作。

这里是另一个关于GIS和MySQL的链接:http://www.slideshare.net/henrikingo/spatial-functions-in-mysql-56-mariadb-55-postgis-20-and-others

也许这个Java项目能帮上忙。不过,该项目是以公里为单位进行配置的。你可以在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 '城市资源。json"文件包含来自比利时的所有城市。如果您愿意,也可以删除或创建条目。只要不更改名称和/或结构,就不需要更改代码。

一定要阅读README https://github.com/GlennVanSchil/LocationFinder