LatLng ポイントが円の境界内にあるかどうかをテストするにはどうすればよいですか? (Google マップ JavaScript v3)
getBounds() メソッドは円のバウンディング ボックス (長方形) を返すため、ポイントが円の外側にあるがバウンディング ボックス内にある場合、間違った答えが得られます。
LatLng ポイントが円の境界内にあるかどうかをテストするにはどうすればよいですか? (Google マップ JavaScript v3)
getBounds() メソッドは円のバウンディング ボックス (長方形) を返すため、ポイントが円の外側にあるがバウンディング ボックス内にある場合、間違った答えが得られます。
球面ジオメトリ ライブラリを使用します(必ず API に含めてください)。
function pointInCircle(point, radius, center)
{
return (google.maps.geometry.spherical.computeDistanceBetween(point, center) <= radius)
}
距離の比較は、かなり簡単に手動で行うことができます。
(x1 - x2)^2 + (y1 - y2)^2 <= D^2
Circleオブジェクトを使用して表示することができます。
new google.maps.Circle({
map : map,
center : new google.maps.LatLng(lat,lng),
strokeColor:'#00FFCC',
strokeWeight:2,
fillOpacity:0,
radius:radiusm
});
そして、ピタゴラスの定理を座標に適用します。ただし、この場合、緯度と経度の1°の間の比率は緯度によって異なるため、これを「実際の」円にするには、少なくとも次のように調整する必要があります。
var kmRadius = 100; //(radius of 100 km)
var lat_gap = kmRadius/111.1;
var lng_gap = lat_gap / Math.cos(lat / (Math.PI/180));
このような方法でうまくいくはずです(コードはテストされていません):
public boolean pointInCircle(Circle c, LatLng coord) {
Rectangle r = c.getBounds();
double rectX = r.getX();
double rectY = r.getY();
double rectWidth = r.getWidth();
double rectHeight = r.getHeight();
double circleCenterX = rectX + rectWidth/2;
double circleCenterY = rectY + rectHeight/2;
double lat = coord.getLatitude();
double lon = coord.getLongitude();
// Point in circle if (x−h)^2 + (y−k)^2 <= r^2
double rSquared = Math.pow(rectWidth/2, 2);
double point = Math.pow(lat - circleCenterX, 2) + Math.pow(lon - circleCenterY, 2);
return (point <= rSquared) ? true : false;
}
これをピタゴラスの定理で簡単に計算してみませんか?あなたはa²+b²=c²を知っています。c が r (半径) よりも小さい場合は、内側にあることがわかります。
var isInside=Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2) >= r*r;