348

Google マップ V3 で 2 つのマーカー間の距離をどのように計算しますか? (distanceFrom関数 inV2 に似ています。)

ありがとう..

4

16 に答える 16

502

自分で計算したい場合は、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
};
于 2009-10-01T09:07:35.633 に答える
320

実は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);
于 2011-02-02T12:59:31.480 に答える
37

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));       
于 2015-04-07T12:04:37.683 に答える
16

これを 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);
于 2011-03-10T19:31:57.347 に答える
14
//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);              
}
于 2015-10-12T13:28:21.033 に答える
11

Google では、球形の APIを使用してそれを行うことができますgoogle.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);

ただし、球面投影または有弦関数の精度が十分でない場合 (たとえば、極に近い場合、またはより長い距離を計算する場合)、別のライブラリを使用する必要があります。

ウィキペディアで見つけた主題に関するほとんどの情報ここ

特定のアルゴリズムの精度が適切かどうかを確認するコツは、地球の最大半径と最小半径を入力し、その違いがユース ケースで問題を引き起こす可能性があるかどうかを確認することです。詳細については、この記事を参照してください。

最終的には、google api または haversine が問題なくほとんどの目的を果たします。

于 2013-01-22T10:39:20.030 に答える
11

これは、このフォーラムの 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
    }

}    
于 2011-02-18T11:16:09.293 に答える
9

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を返します。
      }
}

//関数はここで終了します
于 2012-06-21T07:32:21.800 に答える
3

やらなきゃいけなかった… アクションスクリプトのやり方

//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;
}
于 2012-12-13T05:06:00.213 に答える
3

私の場合、現在の場所を取得して、現在の場所から特定の距離内にあるすべての郵便番号を検索したかったため、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
于 2014-04-14T19:23:32.493 に答える
0

まず、パス全体の長さとしての距離を指していますか、それとも変位(直線距離)だけを知りたいですか?ここで距離と変位の違いを指摘している人は誰もいないようです。距離については、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);
}
于 2021-01-18T04:06:32.890 に答える