ユーザーの緯度経度を取得したかどうかを知りたいのですが、データベース (MongoDB) に保存されているポリゴンのいずれかに彼がいるかどうかを確認したいと考えています。mongoDB を使用してこれをどのように実現できますか。たとえば、私のデータベースには、GeoJson オブジェクトとして格納された 10 個のポリゴンがあります。緯度経度を取得し、この緯度経度が DB 内の 10 個のポリゴンのいずれかにあるかどうかを確認したいと考えています。これはMongoDBで実現できますか?
3 に答える
あなたの特定のケースがMongoDBで達成できるとは思いません。MongoDB には、$polygon operatorを使用したポリゴン計算があります。ただし、この演算子はポリゴンを取得し、その中にドキュメントがあるかどうかを確認します。逆ではありません。
このコードをjavascriptで書きましたが、うまく機能しています
var polygonData = "43.64486433588385,-79.3791389465332;43.64508171979899,-79.3930435180664;43.63682057801007,-79.38437461853027;43.63946054004705,-79.36819553375244;43.652720712083266,-79.37201499938965;43.65793702655821,-79.39111232757568;43.64927396999741,-79.37222957611084";
var lat='43.64927396999741'; var lng='-79.37222957611084';
polySearch(polygonData,lat,lng);
function polySearch(polygonData,lat,lng){ var lat_long=lat+","+lng;
var longitude_x = lng;
var latitude_y = lat;
var is_in_polygon=false;
var vertices_x=[];
var vertices_y=[];
var arr=polygonData.split(';');
for(var j=0; j<arr.length; j++){
var arr1=arr[j].split(',');
vertices_x.push(arr1[1]);
vertices_y.push(arr1[0]);
}
var points_polygon = vertices_x.length;
var isIn=isInPolygon(points_polygon, vertices_x, vertices_y, longitude_x, latitude_y);
if (isIn==1)
console.log('Which is in polygon');
else
console.log('Which is not in polygon');
function isInPolygon(points_polygon, vertices_x, vertices_y, longitude_x, latitude_y)
{
var i = 0;
var j = 0;
var c = 0;
for (i = 0, j = points_polygon-1 ; i < points_polygon; j = i++) {
var val="((("+vertices_y[i]+" > "+latitude_y+") != ("+vertices_y[j]+" > "+latitude_y+")) && ("+longitude_x+" < ("+vertices_x[j]+" - "+vertices_x[i]+") * ("+latitude_y+" - "+vertices_y[i]+") / ("+vertices_y[j]+" - "+vertices_y[i]+") + "+vertices_x[i]+"))";
if(eval(val))c=!c;
}
return c;
}
}
過去 2 つのリンクだけで申し訳ありませんが、これらのリンクは、私よりもはるかに優れた方法を説明していると思います。