15

かなり自明です。私はグーグルマップを使用していて、緯度と経度の点が半径の円内にあるかどうかを調べようとしています。たとえば、x(xはユーザーが選択します)。

バウンディングボックスはこれでは機能しません。私はすでに次のコードを使用してみました:

distlatLng = new google.maps.LatLng(dist.latlng[0],dist.latlng[1]);
var latLngBounds = circle.getBounds();
if(latLngBounds.contains(distlatLng)){
      dropPins(distlatLng,dist.f_addr);
}

これでも、マーカーは円の外側に配置されます。

これは曲率や面積の計算が必要な簡単な計算だと思いますが、どこから始めればよいのかわかりません。助言がありますか?

4

6 に答える 6

16

ドラッグ可能なセンター マーカーを使用したワーキング ソリューション

試したことはありcontainsますか?LatLngBoundsコンストラクタを見てください。

それについての記事を書きました。これには、動作中のJSFiddle.net の例へのリンクが含まれています。

jsFiddle のスクリーンショット


更新版

于 2011-12-16T07:31:54.173 に答える
10

残念ながら、ピタゴラスは球体では役に立ちません。したがって、Stuart Beard の答えは正しくありません。経度の差は、メートルに対する比率が一定ではなく、緯度によって異なります。

正しい方法は、大圏距離の式を使用することです。地球が球形であると仮定すると、適切な概算は次のとおりです (C++):

/** Find the great-circle distance in metres, assuming a spherical earth, between two lat-long points in degrees. */
inline double GreatCircleDistanceInMeters(double aLong1,double aLat1,double aLong2,double aLat2)
    {
    aLong1 *= KDegreesToRadiansDouble;
    aLat1 *= KDegreesToRadiansDouble;
    aLong2 *= KDegreesToRadiansDouble;
    aLat2 *= KDegreesToRadiansDouble;
    double cos_angle = sin(aLat1) * sin(aLat2) + cos(aLat1) * cos(aLat2) * cos(aLong2 - aLong1);

    /*
    Inaccurate trig functions can cause cos_angle to be a tiny amount
    greater than 1 if the two positions are very close. That in turn causes
    acos to give a domain error and return the special floating point value
    -1.#IND000000000000, meaning 'indefinite'. Observed on VS2008 on 64-bit Windows.
    */
    if (cos_angle >= 1)
        return 0;

    double angle = acos(cos_angle);
    return angle * KEquatorialRadiusInMetres;
    }

どこ

const double KPiDouble = 3.141592654;
const double KDegreesToRadiansDouble = KPiDouble / 180.0;

/**
A constant to convert radians to metres for the Mercator and other projections.
It is the semi-major axis (equatorial radius) used by the WGS 84 datum (see http://en.wikipedia.org/wiki/WGS84).
*/
const int32 KEquatorialRadiusInMetres = 6378137;
于 2012-09-12T08:03:30.427 に答える
5

とても簡単です。中心と特定の点の間の距離を計算し、それを半径と比較するだけです。ここから 2 つの緯度経度間の距離を計算するためのヘルプを取得できます

于 2015-12-09T06:18:50.020 に答える
4

次のコードは私にとってはうまくいきます:私のマーカーは円の外側にドラッグすることはできません.代わりに、その端に(あらゆる方向に)ぶら下がり、最後の有効な位置が保持されます.

この関数は、マーカーの「ドラッグ」イベントのイベント ハンドラです。

_markerDragged : function() {
    var latLng = this.marker.getPosition();
    var center = this.circle.getCenter();
    var radius = this.circle.getRadius();
    if (this.circleBounds.contains(latLng) &&
        (google.maps.geometry.spherical.computeDistanceBetween(latLng, center) <= radius)) {
        this.lastMarkerPos = latLng;
        this._geocodePosition(latLng);
    } else {
        // Prevent dragging marker outside circle
        // see (comments of) http://unserkaiser.com/code/google-maps-marker-check-if-in-circle/
        // see http://www.mvjantzen.com/blog/?p=3190 and source code of http://mvjantzen.com/cabi/trips4q2012.html
        this.marker.setPosition(this.lastMarkerPos);
    }
},

http://unserkaiser.com/code/google-maps-marker-check-if-in-circle/http://www.mvjantzen.com/blog/?p=3190に感謝します。

于 2013-04-12T17:24:18.720 に答える
1

私は本当に少し愚かでした。考えてみると、ピタゴラスの定理が使えます。

ポイントからの最大距離 (X マイル) と、2 つの緯度と 2 つの経度があります。これらを使用して三角形を形成すると、点からの距離を解くことができます。

つまりpoint1、座標lat1,lng1が円の中心であり、point2座標lat2,lng2が円内にあるかどうかを決定しようとしている点であることがわかっているとします。

point1とで決まる点を使って直角三角形を作りpoint2ます。これにpoint3は、座標lat1,lng2or lat2,lng1(どちらでもかまいません) があります。次に、差(または必要に応じて)距離を計算します-latDiff = lat2-lat1そしてlngDiff = lng2-lng1

次に、ピタゴラス - を使用して中心からの距離を計算しdist=sqrt(lngDiff^2+latDiff^2)ます。

Google マップで正しく機能するように、すべてをメートルに変換する必要があります。これにより、マイルに 1609 (およそ) を掛け、緯度/経度に 111000 (およそ) を掛けます。これは正確ではありませんが、十分な仕事をします。

すべてが理にかなっていることを願っています。

于 2010-12-18T13:04:04.697 に答える