[PROD Onboard-TIL]空間データベース


必要なスペース・データベース


複数のサービスは、ロケーションベースのサービスを提供します.正常に動作するには、まず、ポイント、線、空間(面)など、地図で使用できる情報をデータベースに含める必要があります.また、これらの格納された良好な情報を実際の状況に応じて使用することもできるはずである.そのため、一般的なデータを格納するのとは異なり、格納空間情報には空間データベースが必要となる.

スペースデータ型


一般的に使用される空間データ型には、下図のようなタイプがあります.

空間データ型で定義されたsqlPoint座標空間では、線分LINESTRING(5、20、22、15)複数の点を結ぶ線分(5、20、17)複数の線分を結んで閉じた状態にある多角形POLLYGON((5、10、30、20、55、20、10、5)複数の点セットMULTIOINT(5、30、30、33、45)複数の「複数行」リング複数の「複数行セット」「複数の「複数行セット」「複数の「複数行セット」「複数行セット」「複数行セット」「複数行セット」「複数行セット」「複数行セット」「複数行セット」「複数行セット」((((5 5 5 5 5 5 5 5 5 5 5、10、30、30、20、20、20、10、10、5、5)」((40 25、44、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、57、35、35、25、25、25、25、40、40、40、40、40、40、40、40、40、40、40、40、40、50、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、40、50、

実際の問題における応用

  • 地域内にユーザが存在するかどうか
  • .
    課題にはPolygonとして保存されている地域データがある.また,緯度と経度で表されるユーザ位置情報(Point)を受信し,領域(データはPolygon)内部か外部かを判断する必要がある.そのためには,データだけでなく空間関係関数が必要である.これを実現するために作成されたコードは次のとおりです.
    async findAreaByLatAndLng(lat: string, lng: string): Promise<Area> {
        const foundArea = await this.manager.query(` 
        select * from area where ST_Contains(area.area_boundary, ST_GeomFromText('POINT(${parseFloat(
          lat,
        )} ${parseFloat(lng)})'));
        `);
    /*
    ST_Contains은 공간 관계 함수. 
    Polygon타입으로 저장되어 있는 area.area_boundary에 
    사용자의 위치가 포함 되어 있는지 여부를 Boolean값으로 리턴한다.
    */
    
        return foundArea;
      }
    ユーザが
  • の領域内にない場合、ユーザと領域との距離は
  • である.
    ユーザーが課題から地域を離れた場合、罰金が科せられます.しかしそれを実現するのは難しいので、Polygonの中心点から、ピタゴラスでユーザーの距離を求めました.しかし,課題を提案した後,それを計算できる空間関係関数があることを発見した.
    async findDistance(lat: string, lng: string) {
      const distance = await this.manager.query(`select ST_Distance(ST_GeomFromText('POLYGON ((-90 180, 0 180, 0 16.34, -90 180))'),ST_GeomFromText('POINT(0 190)'));
        `);
      /*ST_Distance는 공간 데이터 사입 간의 거리를 구해주는 함수이다.
      Polygon타입과 Point타입 간의 거리를 구해준 것이다.
      */
         return distance
      }
    リファレンス
    https://sparkdia.tistory.com/25?category=1114027