Google マップ V3 で 2 つのマーカー間の距離をどのように計算しますか? (distanceFrom
関数 inV2 に似ています。)
ありがとう..
Google マップ V3 で 2 つのマーカー間の距離をどのように計算しますか? (distanceFrom
関数 inV2 に似ています。)
ありがとう..
自分で計算したい場合は、Haversine 式を使用できます。
var rad = function(x) {
return x * Math.PI / 180;
};
var getDistance = function(p1, p2) {
var R = 6378137; // Earth’s mean radius in meter
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
Math.sin(dLong / 2) * Math.sin(dLong / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c;
return d; // returns the distance in meter
};
実はGMap3にはメソッドがあるようです。google.maps.geometry.spherical
名前空間の静的メソッドです。
引数として 2 つのLatLng
オブジェクトを取り、デフォルトの地球半径 6378137 メートルを使用しますが、デフォルトの半径は必要に応じてカスタム値でオーバーライドできます。
以下を必ず含めてください。
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script>
あなたの頭のセクションで。
呼び出しは次のとおりです。
google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);
2点のGPS緯度経度を使用した例。
var latitude1 = 39.46;
var longitude1 = -0.36;
var latitude2 = 40.40;
var longitude2 = -3.68;
var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(latitude1, longitude1), new google.maps.LatLng(latitude2, longitude2));
これを JavaScript コードの先頭に追加するだけです。
google.maps.LatLng.prototype.distanceFrom = function(latlng) {
var lat = [this.lat(), latlng.lat()]
var lng = [this.lng(), latlng.lng()]
var R = 6378137;
var dLat = (lat[1]-lat[0]) * Math.PI / 180;
var dLng = (lng[1]-lng[0]) * Math.PI / 180;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat[0] * Math.PI / 180 ) * Math.cos(lat[1] * Math.PI / 180 ) *
Math.sin(dLng/2) * Math.sin(dLng/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return Math.round(d);
}
次に、次のように関数を使用します。
var loc1 = new GLatLng(52.5773139, 1.3712427);
var loc2 = new GLatLng(52.4788314, 1.7577444);
var dist = loc2.distanceFrom(loc1);
alert(dist/1000);
//p1 and p2 are google.maps.LatLng(x,y) objects
function calcDistance(p1, p2) {
var d = (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
console.log(d);
}
Google では、球形の APIを使用してそれを行うことができますgoogle.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);
。
ただし、球面投影または有弦関数の精度が十分でない場合 (たとえば、極に近い場合、またはより長い距離を計算する場合)、別のライブラリを使用する必要があります。
ウィキペディアで見つけた主題に関するほとんどの情報ここ。
特定のアルゴリズムの精度が適切かどうかを確認するコツは、地球の最大半径と最小半径を入力し、その違いがユース ケースで問題を引き起こす可能性があるかどうかを確認することです。詳細については、この記事を参照してください。
最終的には、google api または haversine が問題なくほとんどの目的を果たします。
これは、このフォーラムの c# 実装です。
public class DistanceAlgorithm
{
const double PIx = 3.141592653589793;
const double RADIO = 6378.16;
/// <summary>
/// This class cannot be instantiated.
/// </summary>
private DistanceAlgorithm() { }
/// <summary>
/// Convert degrees to Radians
/// </summary>
/// <param name="x">Degrees</param>
/// <returns>The equivalent in radians</returns>
public static double Radians(double x)
{
return x * PIx / 180;
}
/// <summary>
/// Calculate the distance between two places.
/// </summary>
/// <param name="lon1"></param>
/// <param name="lat1"></param>
/// <param name="lon2"></param>
/// <param name="lat2"></param>
/// <returns></returns>
public static double DistanceBetweenPlaces(
double lon1,
double lat1,
double lon2,
double lat2)
{
double dlon = Radians(lon2 - lon1);
double dlat = Radians(lat2 - lat1);
double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return (angle * RADIO) * 0.62137;//distance in miles
}
}
PHPを使用すると、次の単純な関数を使用して距離を計算できます。
//2つの緯度と経度の間の距離を計算します 関数calculate_distance($ lat1、$ lon1、$ lat2、$ lon2、$ unit ='N') {{ $ theta = $ lon1-$ lon2; $ dist = sin(deg2rad($ lat1))* sin(deg2rad($ lat2))+ cos(deg2rad($ lat1))* cos(deg2rad($ lat2))* cos(deg2rad($ theta)); $ dist = acos($ dist); $ dist = rad2deg($ dist); $ miles = $ dist * 60 * 1.1515; $ unit = strtoupper($ unit); if($ unit == "K"){ 返品($ miles * 1.609344); } else if($ unit == "N"){ 返品($ miles * 0.8684); } そうしないと { $milesを返します。 } } //関数はここで終了します
やらなきゃいけなかった… アクションスクリプトのやり方
//just make sure you pass a number to the function because it would accept you mother in law...
public var rad = function(x:*) {return x*Math.PI/180;}
protected function distHaversine(p1:Object, p2:Object):Number {
var R:int = 6371; // earth's mean radius in km
var dLat:Number = rad(p2.lat() - p1.lat());
var dLong:Number = rad(p2.lng() - p1.lng());
var a:Number = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c:Number = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d:Number = R * c;
return d;
}
私の場合、現在の場所を取得して、現在の場所から特定の距離内にあるすべての郵便番号を検索したかったため、SQL Server でこれを計算するのが最善でした。また、郵便番号とその緯度経度のリストを含む DB もありました。乾杯
--will return the radius for a given number
create function getRad(@variable float)--function to return rad
returns float
as
begin
declare @retval float
select @retval=(@variable * PI()/180)
--print @retval
return @retval
end
go
--calc distance
--drop function dbo.getDistance
create function getDistance(@cLat float,@cLong float, @tLat float, @tLong float)
returns float
as
begin
declare @emr float
declare @dLat float
declare @dLong float
declare @a float
declare @distance float
declare @c float
set @emr = 6371--earth mean
set @dLat = dbo.getRad(@tLat - @cLat);
set @dLong = dbo.getRad(@tLong - @cLong);
set @a = sin(@dLat/2)*sin(@dLat/2)+cos(dbo.getRad(@cLat))*cos(dbo.getRad(@tLat))*sin(@dLong/2)*sin(@dLong/2);
set @c = 2*atn2(sqrt(@a),sqrt(1-@a))
set @distance = @emr*@c;
set @distance = @distance * 0.621371 -- i needed it in miles
--print @distance
return @distance;
end
go
--get all zipcodes within 2 miles, the hardcoded #'s would be passed in by C#
select *
from cityzips a where dbo.getDistance(29.76,-95.38,a.lat,a.long) <3
order by zipcode
まず、パス全体の長さとしての距離を指していますか、それとも変位(直線距離)だけを知りたいですか?ここで距離と変位の違いを指摘している人は誰もいないようです。距離については、JSON/XML データで指定された各ルート ポイントを計算します。変位については、Spherical
クラスを使用した組み込みのソリューションがあります。
//calculates distance between two points in km's
function calcDistance(p1, p2) {
return (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
}