地図のストーリ|Geo関数-距離を求めます


数値で表すことができる地図データはpoint、linestring、polygon、geometryなど多くあります.
もちろん、データの異なるタイプでの使用をより効果的にする関数もあります.
この文章では、2つの位置間の距離を求める関数を紹介します.

グーグルマップにA、Bの2箇所を手当たり次第に描いて距離を求めた.
画面には、A、Bの位置と2つの位置の間の距離が76.04メートルの値が表示されます.
Google mapが2つの位置間の距離を教えてくれたように、sqlを通じて同じ機能を得ることを望んでいます.
AとBの間の距離を求めるとき、数学の授業で学んだ距離を求める公式に従って、経度、緯度ごとに公式に代入し、求める方法で距離を求めると、求める距離が非常に長くなります.この場合、次の関数を使用できます.

ST Distance(p 1,p 2):平面上の2点間の距離を求める

select st_distance(POINT(128.89545004049526, 37.718265020117755), 
                   POINT(128.89472519954293, 37.71788979005703)); 

ふん!結果値が予想値に達しなかった.
値は76メートルですが、小数点は1未満です.
私たちが生活している地球は平面ではなく、丸いので、平面上の2点間の距離を求める関数は地球上の距離を知ることができません.

SRID-0, SRID-4326

  • SRID-0:単純直交座標系
  • を表す
  • SRID-4326:
  • GPS基準座標系を示す
    これはst distance()がsrid−0の単純な直交座標に基づいて計算されるためである.
    この関数の応答はMySQLバージョンによって異なります.

    MySQL 8.0


    MySQL 8.0から、以下に示すように、st distance()を使用して76 mを取得できます.srid−4326に変換された場合、識別することができる.
    set @loc = ST_SRID(Point(128.89472, 37.71788), 4326);
    set @loc2 = ST_SRID(Point(128.89545, 37.71826), 4326);
    
    select ST_Distance(@loc, @loc2)                       as distance,
           ST_Distance_Sphere(Point(128.89472, 37.71788),
                              Point(128.89545, 37.71826)) as distance_sphere;

    sqlは少し長くなりましたが、欲しい値が得られました.

    MySQL 5.X


    しかし、バージョン8.0のMySql 5ではありません.Xを使用すると、srid-4326は認識されないため、必要な値は得られません.下の画像は5です.Xバージョンを選択した結果です.

    したがって、MySQLバージョンを考慮することなく、次の関数を使用して地球上の位置間の距離を求めることができます.

    ST Distance Sphere(p 1,p 2):球内の2座標間の距離→地球距離を求める必要があるため,関数を用いて距離を問い合わせる必要がある.


    私たちが生活している地球は平面ではなく丸いので、必要な76 mを求めるにはsrid-4326に基づいて計算されたst distang shpre()関数を使用しなければなりません.
    select st_distance_sphere(POINT(128.89545004049526, 37.718265020117755), 
                              POINT(128.89472519954293, 37.71788979005703));

    76 mの期待値が得られた.
    これらの距離導出関数は、次の場合に使用できます.
    街に人がいて、特定の建物が存在する場合、この関数を使用して、どの建物や機器がより近い場所に存在するかを表します.結果が得られました.
    クエリの形式は次のとおりです.
    SELECT id,
           point_info,
           st_distance_sphere(point_col, POINT(126.97725, 37.570892)) as distance
    FROM test_point 
    ORDER BY distance
    limit 1
    limit N(特定の数値)のみを指定する場合は、上記のsqlを使用して、私の周りで店を探すなどの機能を得ることができます.
    もちろん、geoタイプのカラムにspatial indexを追加してこそ、必要な結果をより迅速に得ることができます.
    残念なことに、st distang sphere()関数は、点と点の間の距離だけを測定します.
    ジオメトリタイプとポイント間の距離がNmであるかどうかを指定する場合は、MySQL 8.0バージョンを使用して、次の形式で求めることができます.
    SELECT id,
           st_distance(st_srid(geometry_col, 4326), ST_SRID(Point(128.89472, 37.71788), 4326) ) as distance
    FROM test_location
    ORDER BY distance
    limit 10
    geometry colには、geoタイプの点、ポリゴン、およびgeometryタイプのすべての列が含まれます.
    DBを用いて2つの位置間の距離を求める関数を作成した.
    これは簡単に見える関数ですが、これらの関数があれば、もっと簡単に距離を求めることができると思います.
    この関数は、位置ベースのタイプを調べたときに見つかりましたが、残念ながら、いくつかの理由で会社のプロジェクトで使用されていません.しかし、このように調査して整理すれば、いつかそれを使うときは、すぐに出して使うと信じています.🌝
    本文のsqlはMySQLに基づいて作成されていますが、geo-typeを提供する他のデータベースにも使用できると思います.また、今後の位置関連作業にも役立ちます.
    次に、位置が交差しているかどうかを求める関数を作成してみます.