Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Long/Lat坐标在另一个邮政编码的半径内查找列表的邮政编码/坐标_Php_Mysql_Dictionary_Math_Zipcode - Fatal编程技术网

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

Php 使用Long/Lat坐标在另一个邮政编码的半径内查找列表的邮政编码/坐标,php,mysql,dictionary,math,zipcode,Php,Mysql,Dictionary,Math,Zipcode,我想找到一个邮政编码任意半径范围内的所有物品。e、 g.距离90210 10英里,距离00603 100英里,等等 如果我的查询是“距离90210 10英里”,我想返回这个10英里半径内的所有列表。这些列表也是邮政编码,所以我基本上想找到这个10英里半径内的所有其他邮政编码 我想,一旦我收集了radius中的所有邮政编码,然后我将它们添加到一个数组中,然后使用SQL查找所有在该数组中包含邮政编码的列表。然而,我不确定这是否是最好的方法 我曾尝试过做研究,但它对我来说变得非常复杂;我认为这可能与一

我想找到一个邮政编码任意半径范围内的所有物品。e、 g.距离90210 10英里,距离00603 100英里,等等

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

我想,一旦我收集了radius中的所有邮政编码,然后我将它们添加到一个数组中,然后使用SQL查找所有在该数组中包含邮政编码的列表。然而,我不确定这是否是最好的方法

我曾尝试过做研究,但它对我来说变得非常复杂;我认为这可能与一个大圆圈有关。我也一直在研究航空公式,但仍然无法得出任何结果

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


关于如何计算这些半径,我在这里完全不知所措。

您提到了三个不同的问题:

  • “英里”和“地理坐标”没有直接的翻译。正如你可能听说过的,地球不是平的,这意味着赤道和洛杉矶纬度1º的经度将以英里为单位有一个不同的值。您链接的公式是的应用程序,它允许您以更快的近似值转换经纬度差

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

    它包括使用边界框进行过滤,这使得MySQL功能更容易实现上一个链接在一个分步指南中包含所有公式和查询。

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


这里是关于GIS和MySQL的另一个链接:

您可以通过调用下面的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返回距离zipcode 90210近10英里的所有zipcode


希望这会对您有所帮助。

也许这个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;
}
公共列表FindCityRange(地质点-地质点,双距离){
List cities=new ArrayList();
QueryBuilder QueryBuilder=地理距离查询(“地理点”)
.point(geoPoint.getLat(),geoPoint.getLon())
//.距离(距离,距离单位.km)原始
.距离(距离,距离单位。英里)
.optimizeBbox(“内存”)
.大地距离(大地距离弧);
SearchRequestBuilder=esClient.getClient()
.prepareSearch(索引)
.setTypes(“城市”)
.setSearchType(SearchType.QUERY\u然后\u FETCH)
.setScroll(新时间值(60000))
.setSize(100).setExplain(真)
.setPostFilter(queryBuilder)
.addSort(SortBuilders.geoDistanceSort(“地理点”)
.order(SortOrder.ASC)
.point(geoPoint.getLat(),geoPoint.getLon())
//.单位(距离单位.公里);原始
.单位(距离单位.英里));
SearchResponse=builder
.execute()
.actionGet();
SearchHit[]hits=response.getHits().getHits();
纸卷:
while(true){
for(SearchHit:hits){
映射结果=hit.getSource();
add(mapper.convertValue(result,City.class));
}
response=esClient.getClient();
if(response.getHits().getHits().length==0){
打破卷轴;
}
}
回归城市;
}
“LocationFinder\src\main\resources\json\cities.json”文件包含来自比利时的所有城市。如果需要,也可以删除或创建条目。只要不更改名称和/或结构,就不需要更改代码


一定要阅读自述文件

像这样的东西怎么样?我不想使用API,我有一个包含所有必要信息的数据库,我只是不知道如何实现我想要的。所以,基础是:获取邮政编码的长度和纬度,计算以英里为单位的距离,然后计算该距离的半径,然后根据计算半径内的纬度和经度搜索数据库中的所有拉链,再次转换为纬度和经度。“计算以英里为单位的距离”是什么?半径不需要计算,例如设置为100英里。那么,为每个列表做一个表连接,增加一列距离邮政编码,怎么样?然后过滤所有小于100英里的距离?当然这将简化计算(这是一个常见的非规范化/优化技巧),但要小心,因为