我想查找邮政编码任意半径内的所有清单。例如:距离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