Php 使用Long/Lat坐标在另一个邮政编码的半径内查找列表的邮政编码/坐标
我想找到一个邮政编码任意半径范围内的所有物品。e、 g.距离90210 10英里,距离00603 100英里,等等 如果我的查询是“距离90210 10英里”,我想返回这个10英里半径内的所有列表。这些列表也是邮政编码,所以我基本上想找到这个10英里半径内的所有其他邮政编码 我想,一旦我收集了radius中的所有邮政编码,然后我将它们添加到一个数组中,然后使用SQL查找所有在该数组中包含邮政编码的列表。然而,我不确定这是否是最好的方法 我曾尝试过做研究,但它对我来说变得非常复杂;我认为这可能与一个大圆圈有关。我也一直在研究航空公式,但仍然无法得出任何结果 我有一个邮政编码数据库,包含所有邮政编码的经度和纬度,以及城市和州信息。这是我需要的足够的信息。我想我只需要知道数学;我不想使用APIPhp 使用Long/Lat坐标在另一个邮政编码的半径内查找列表的邮政编码/坐标,php,mysql,dictionary,math,zipcode,Php,Mysql,Dictionary,Math,Zipcode,我想找到一个邮政编码任意半径范围内的所有物品。e、 g.距离90210 10英里,距离00603 100英里,等等 如果我的查询是“距离90210 10英里”,我想返回这个10英里半径内的所有列表。这些列表也是邮政编码,所以我基本上想找到这个10英里半径内的所有其他邮政编码 我想,一旦我收集了radius中的所有邮政编码,然后我将它们添加到一个数组中,然后使用SQL查找所有在该数组中包含邮政编码的列表。然而,我不确定这是否是最好的方法 我曾尝试过做研究,但它对我来说变得非常复杂;我认为这可能与一
关于如何计算这些半径,我在这里完全不知所措。您提到了三个不同的问题:
- “英里”和“地理坐标”没有直接的翻译。正如你可能听说过的,地球不是平的,这意味着赤道和洛杉矶纬度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英里的距离?当然这将简化计算(这是一个常见的非规范化/优化技巧),但要小心,因为