2010-04-19 57 views
7

早上好。将公里添加到地图点

我想知道如何将公里添加到地图点(纬度/经度)。

例如:Jaraguádo Sul城市在纬度-26.462049,经度-49.059448。我想增加100公里上下,并在两侧。我想做一个广场,并获得新的点。

我该怎么做?

我试了一下:

<?php 
$distance = 100; 
$earthRadius = 6371; 
$lat1 = -26.4853239150483; 
$lon1 = -49.075927734375; 
$bearing = 0; 

$lat2 = asin(sin($lat1) * cos($distance/$earthRadius) + cos($lat1) * sin($distance/$earthRadius) * cos($bearing)); 
$lon2 = $lon1 + atan2(sin($bearing) * sin($distance/$earthRadius) * cos($lat1), cos($distance/$earthRadius) - sin($lat1) * sin($lat2)); 

echo 'LAT: ' . $lat2 . '<br >'; 
echo 'LNG: ' . $lon2; 
?> 

但它返回错误cordinates。谢谢!

非常感谢。

+0

到目前为止的2个答案是一般的方法。但是,如果精度不重要,并且如果感兴趣的地理区域受到限制 - 特别是在狭窄的纬度范围内 - 则可以对这些函数进行拟合。我无法提供“乐队有多宽”和“多少不精确”的细节。 然后,如果地理范围有限,则可以创建一个查找表:-) – Smandoli 2010-04-19 15:41:17

+0

如果您更详细地指定了您的应用,最终目标或工作工具,那么您可能会获得有关特定解决方案的新闻(例如, CoreLocation for iPhone) – Smandoli 2010-04-19 15:51:31

+2

我正在创建一个PHP应用程序,并且在我的州(圣卡塔琳娜州)的每个城市都有一个数据库表(城市)。在这张表中,我有纬度/经度字段。 用户进入城市,我需要创建一个100km的虚构广场来找到他附近的企业。 对不起,我的英语和缺乏信息的抱歉。 谢谢你们! – proveyourselfthom 2010-04-19 16:09:12

回答

1

UPDATE:

PHP三角函数取弧度为Paramters,没有学位,所以你需要使用deg2rad()作为参数:

sin(deg2rad($lat)) 

http://www.php.net/manual/en/function.deg2rad.php


原来的答复:

一个很大的话题确实如此。根据你所要求的精度(和距离覆盖),你可能不得不考虑地球不是一个完美的球体,而是一个大地水准面(扁平的椭球体)。

http://en.wikipedia.org/wiki/Earth_radius

将让你就这样开始了。

映射和投影是两个话题,你应该看看,太

从维基百科基于新的信息距离

http://en.wikipedia.org/wiki/Geographical_distance

+1

这个星球在哪里'时代',你是怎么来到这里的? – 2010-04-19 20:48:14

+0

只需获得另外200个声望并编辑错别字;) – sum1stolemyname 2010-04-20 05:43:06

0

的话题另一个链接,我有两个备选方法。 (1)Google“PHP GIS”。你会发现一些有趣的资源。也许一个人会工作。 (2)如果你的企业是经纬度标识的,那么你将不得不使用(1)我认为。但是,有没有“笨蛋”的方法?例如,如果每个企业都链接到一个城市,则使用简单的地图坐标(“K16”)来标识城市。或者代码方面有点聪明,但这就是主意。

7

正如已经指出的那样。 PHP三角函数以弧度为参数。

度参数的弧度转换将做的伎俩。你可能想要度数的结果,所以使用rad2deg转换回来:

<?php 
$distance = 100; 
$earthRadius = 6371; 
$lat1 = deg2rad(-26.4853239150483); 
$lon1 = deg2rad(-49.075927734375); 
$bearing = deg2rad(0); 

$lat2 = asin(sin($lat1) * cos($distance/$earthRadius) + cos($lat1) * sin($distance/$earthRadius) * cos($bearing)); 
$lon2 = $lon1 + atan2(sin($bearing) * sin($distance/$earthRadius) * cos($lat1), cos($distance/$earthRadius) - sin($lat1) * sin($lat2)); 

echo 'LAT: ' . rad2deg($lat2) . '<br >'; 
echo 'LNG: ' . rad2deg($lon2); 
?>