让我来解释一下这个项目。我们有一大堆有地址的商店列表。数据库中的每个地址都有一个地理位置。
现在我的问题是:当用户填写他的地址和邮政编码等,我们有他的位置和他的地理位置,有没有可能在谷歌地图中找到最近的商店基于用户的位置。如果不是通过地理位置,那么可能是基于邮政编码?
我已经查看了google地图api,但没有找到能做到这一点的jet。重要的是,它可以在我们添加到谷歌地图的商店中进行搜索。我宁愿不使用谷歌地图,而只使用:http://maps.googleapis.com/maps/api/geocode/json
如果可能的话,我们可以不使用谷歌地图,而是根据地理位置搜索数据库,这样会更好。
唯一的问题是,你如何根据地理位置或其他东西进行匹配?你只需检查其中一个是更小还是更大,还是有更多,然后比较两个?
如果有人能就如何做到这一点给我一个很好的指导,那就太好了。
发布于 2013-05-30 23:58:24
首先使用地图,并要求用户设置他的大致位置,获取该值,使用此代码获取到每个商店的距离:
google.maps.geometry.spherical.computeDistanceBetween (latLngA,latLngB);
来自https://developers.google.com/maps/documentation/javascript/reference?hl=en-US#spherical
现在选择较短的并输出它
但我宁愿让他输入City,并通过Wolfram api请求获取距离
$city=customer_city;
$north=store_north; //coordinate_l
$west=store_west; //coordinate_L
$wolfram_query="http://api.wolframalpha.com/v2/query?appid=".$appid."&input=distance%20from%20".$city."%20to%20".$north."N%20".$west."W%20in%20km&format=image,plaintext";并得到与xml答案之间的距离,而不是google地图
使用zipcode的另一种选择是使用这个php函数从两个坐标计算球面距离,该函数在一个while循环中遍历所有的经纬度和经度:
function calcDist($lat_A, $long_A, $lat_store[i], $long_store[i]) {
$distance = sin(deg2rad($lat_A))
* sin(deg2rad($lat_B))
+ cos(deg2rad($lat_A))
* cos(deg2rad($lat_B))
* cos(deg2rad($long_A - $long_B));
$distance = (rad2deg(acos($distance))) * 69.09;
return $distance;
} 距离是以英里为单位的,如果您想要以公里为单位的距离,请使用以下命令
function miles2kms($miles) {
$ratio = 1.609344;
$kms = $miles * $ratio;
return $kms;
}您可以使用以下数据库检索邮政编码的最新和最长信息:http://sourceforge.net/projects/zips/files/#files或http://postcodedb.sourceforge.net/dumpCSV.php
为了改善距离的结果,你应该使用Haversine或Vincenty计算...更复杂的是..
..。但我们喜欢网络的是,肯定有人在我们之前做了这件事,当然也分享了他的努力!http://www.phpclasses.org/package/6480-PHP-Calculate-the-distance-between-Earth-two-points.html这是一个实现无正弦距离的类!这样可能更好..。如果你想使用Vincenty,试试这个:Implementing Vincenty's Formula in PHP,试试哪个能给你最好的结果,即使最准确的总是wolfram,数学家们对此进行了研究,所以效果很好;)
发布于 2013-05-30 23:43:11
当你说“地理位置”时,你有关于这个位置的具体信息吗?我使用实体的坐标(经度和经度)以及附近感兴趣的地方的大量坐标做了类似的事情。因为lat和long (十进制)是just...decimals,所以通过找到LAT值和long值之间的最小差值来计算哪个点离另一个点最近是一个等式。
例如,如果您想要考虑点之间的旅行时间,这将变得复杂得多,但对于简单的应用程序,比较坐标就足够了。
https://stackoverflow.com/questions/16840274
复制相似问题