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


地図サービスを使用して、ユーザーの位置に応じて地図を表示します.
GoogleマップまたはNAVERマップは、ユーザーの現在の位置に応じて中央に位置し、近くの地図を表示し、ユーザーがアプリケーション内の地図を移動またはドラッグすると、異なる位置の地図を表示することができます.
私たちが共有スケートボードサービスを提供している会社は、これらの地図のほか、ユーザーが表示しているアプリケーションに表示されている地図に、私たちの会社がサービスしているどのエリアも表示しなければなりません.返却できないエリアにはこれらの場所があります.
MySQLを使用する場合、無数の領域を選択してアプリケーションに撒き散らすと、多くの時間がかかりますが、アプリケーション内の地図も非常に重くなり、サービスが死亡することもあります.
私が考えたのは,現在のユーザが見ている領域のみをインポートすることである.(もちろん、もう一つの方法を見つけました...)
そのときに検索して使用する関数は、今から紹介します.

stオーバーラップ():地図をオーバーラップするかどうか

  • ジオメトリが「空間オーバーラップ」の場合、Trueの関数が返されます.これは互いに交差することを意味するが、falseが完全に含まれている.
    下の画像を見ると分かりやすいかもしれません.

    1つの関数で、trueは、完全に含まれていない場合にのみ返されます.
  • 地図を含めるかどうか


    もしそうであれば、次の2つの関数を使用して、重複する場合ではなく、特定のジオメトリを含む場合を取得できます.

    st in(a,b):aはbに含まれる


    この関数は、図の最初の例に示すように、bにaというジオメトリが含まれているかどうかを求めるために使用されます.
    -- return 1
    select 
    	ST_Within(Point(2,2), 
    	ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))'));
    -- return 0
    select 
    	ST_Within(ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))'), 
        Point(2,2));
    SQLを見ると、Trueが最初のsqlから下がっているのも見えます.

    st contains(a,b):bはaに含まれる


    この関数は、図2の例に示すように、aにbというジオメトリが含まれているかどうかを求めるために使用されます.
    -- return 1
    select 
    	ST_Contains(ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))'), 
        POINT(2,2)); 
    
    -- return 0
    select 
    	ST_Contains(POINT(2,2), 
        ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))')); 
    SQLを見ると、Trueが最初のsqlから下がっているのも見えます.
    どちらの関数も含めるかどうかを求める関数なので、ポリラインの頂点を含めるかどうかを要求する場合は使用できません.
    -- return 0
    select 
    	ST_Contains(ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))'), 
        POINT(1,1)); 
    
    -- return 0
    select 
    	ST_Within(Point(1,1), 
        ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))')); 
    オーバーラップ処理を考慮しない.
    1つのポイントについて、このポイントはポリゴンに含まれていますか?この2つの関数は、処理時に使用できます.

    st交差(a,b):オーバーラップ、含む

  • ジオメトリまたは地形データが一部の空間を共有している場合はtrueを返します.オーバーラップと埋め込みはtrueを返します.この関数は、st contains()、st in()およびst overlabs()のすべての内容をtrueに戻す場合に使用できます.
  • 半径内にどの領域があるかを処理する場合は、st intercept()関数を使用します.
    select * from test_tb
    where 
    	(ST_Intersects(ST_GeomFromText('POLYGON((1 1,4 1, 4 3, 1 3, 1 1))'), 
        geometry_col))
    上記の形式でクエリーを行いますが、st geomeFromText関数の値は例の値ですが、実際にクエリーする半径にポリラインを追加するだけです.

    半径内の2点を使用してポリラインを作成するには



    上記の画像では、矩形はAPPであり、APIをマッピングしてユーザが浮遊する地図を見ることができる.
    ユーザがマップを移動またはドラッグするたびに、そのマップに表示される2つの頂点の値は変化し続けますよね?
    この2つの値だけを送信すると、アプリケーション内にのみ存在する領域を得るにはどうすればいいのでしょうか.
    この2つの点を利用して、残りの2つの頂点を求めて、多角形を作成すればいいです!

    残りの2つの頂点を取得するには、上記の画像の順序で2つの点を使用します.
    4つの頂点を作成し、1つ目の頂点を追加する理由は、3番目の点と4番目の点に接続してこそ、完全なpolygonを作成できるため、以前の文書でも説明されています.
    次のPolygonデータを作成できます.
    [
        [lng1, lat1],
        [lng2, lat1],
        [lng2, lat2],
        [lng1, lat2],
        [lng1, lat1]
    ]
    このように交差する領域について,得られる4つの関数をまとめた.
    いずれにしても、範囲内の領域を求める場合は、st intercuts()関数を使用して、st intercuts()関数を含む位置を求めることが望ましい.
    半径内に存在する領域を入力する際に利用できる関数を理解した.
    次の記事では、ある日使用可能な関数を作成します.