0

私のデータベースのテーブルには、次のような経度と緯度の情報も含む多くの住所が含まれています。

名前 ---- 番地 -------- 郵便番号 ---- 経度 ---- 緯度

フレッド ---- 11 モナーク ストリート ----- 4114 ---------- 57.317715 ---- 10.154355

バーニー -- 4 レイン ストリート -------- 4114 ------------ 56.151112 ---- 10.087925

次のように定義された特定のエリア(Googleマップによるkml座標)があります:

        12.548740,55.694469,0.000000
        12.541320,55.687840,0.000000
        12.537410,55.690552,0.000000
        12.535310,55.694641,0.000000
        12.534499,55.695293,0.000000
        12.535787,55.696625,0.000000
        12.538100,55.696911,0.000000
        12.543890,55.697659,0.000000
        12.548740,55.694469,0.000000

エリア内にある住所を見つけるには、どの mysql クエリを使用すればよいですか?

4

1 に答える 1

0

これに対するMySQLクエリはわかりません。

この回答では、PHP 関数を使用して、ポイントがポリゴン (4 ポイント) 内にあるかどうかを確認します。この関数は、 Darel Rex FinleyによるC コードPoint in Polygonに基づいています。

8 ポイント ポリゴンに使用できます。

$polySides  = 8; //how many corners the polygon has
$polyX    =  array(12.548740,12.541320,12.537410,12.535310,12.534499,12.535787,12.538100,12.543890,12.548740);//horizontal coordinates of corners
$polyY    =  array(55.694469,55.687840,55.690552,55.694641,55.695293,55.696625,55.696911,55.697659,55.694469);//vertical coordinates of corners
$x = 12.548740; 
$y = 55.694469;//Inside
//$y = 12.528740;//Outside

function pointInPolygon($polySides,$polyX,$polyY,$x,$y) {
  $j = $polySides-1 ;
  $oddNodes = 0;
  for ($i=0; $i<$polySides; $i++) {
    if ($polyY[$i]<$y && $polyY[$j]>=$y 
 ||  $polyY[$j]<$y && $polyY[$i]>=$y) {
    if ($polyX[$i]+($y-$polyY[$i])/($polyY[$j]-$polyY[$i])*($polyX[$j]-$polyX[$i])<$x)    {
    $oddNodes=!$oddNodes; }}
   $j=$i; }

  return $oddNodes; }


 if (pointInPolygon($polySides,$polyX,$polyY,$x,$y)){
  echo "Is in polygon!";
}
else echo "Is not in polygon";

関数に lat,lng を挿入して、データベースをループできます。

データベースが大きい場合は、north_west および south_east 座標で境界ボックスを作成して、関数によってフィルター処理されるデータを制限できます。

$sql = "SELECT lat,lng FROM `table` WHERE (lng BETWEEN '$west_lng' AND '$east_lng') AND (lat BETWEEN '$north_lat' AND '$south_lat')";

もう1つの解決策は、mysql空間拡張を使用することです

于 2013-09-30T20:17:22.747 に答える