2010-04-19 61 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); 
?>