MySQL 空間データストレージと関数

MySQL 空間データストレージと関数

MULTIPOINT (マルチポイント)、 MULTILINESTRING (マルチライン)、 MULTIPOLYGON (マルチファセット)、 GEOMETRYCOLLECTION (ポイント、ライン、面を含むコレクション)などのタイプもあります。

2. GeoJSONとは

GeoJSON 、さまざまな地理データ構造をエンコードするための形式です。 GeoJSON オブジェクトは、ジオメトリ、フィーチャ、またはフィーチャのコレクションを表すことができます。 GeoJSON 、ポイント、ライン、ポリゴン、マルチポイント、マルチライン、マルチポリゴン、ジオメトリ コレクションなどのジオメトリ タイプをサポートします。 GeoJSONのフィーチャにはジオメトリ オブジェクトとその他のプロパティが含まれ、フィーチャ コレクションはフィーチャのセットを表します。完全な GeoJSON データ構造は常にオブジェクトです (JSON 用語では)。 GeoJSON では、オブジェクトは名前と値のペアのコレクション(メンバーとも呼ばれます)で構成されます。各メンバーの名前は常に文字列です。メンバーの値は、文字列、数値、オブジェクト、配列、または「 true 」、「 false 」、および「 null 」のいずれかのリテラル定数です。配列は、上記の値を持つ要素で構成されます。


単純な点、線、面に加えて、複雑な地理環境や地図業務に対応するために、マルチポイント( MultiPoint )、マルチライン( MultiLineString )、マルチポリゴン( MultiPolygon )、ジオメトリコレクション( GeometryCollection )などが登場します。JSONに精通している人は、 geojsonをすぐに理解して適用することができます。

3. 空間データ型のフォーマット(ジオメトリをGeoJSONに変換する)

データベースに保存された空間データは、上記の例に示すように、視覚化ツールを通じてプレーンテキスト形式で表示されます。この構造はクライアントにとって解析が容易ではないため、MySQL では空間データを解析してフォーマットするための空間関数がいくつか用意されています。Geojson geojson 、GIS 空間データを表示するための標準形式です。フロントエンド マップ フレームワークとバックエンド空間分析フレームワークの両方がgeojson形式をサポートしています。

例:

サンプルデータの準備

関数の適用例

1. ルテン気象観測点の情報を照会し、ジオメトリをgeojson形式に変換します。

SQLを実行します:

id = 1 の場合、meteorological_point から geojson として id、point_name、ST_ASGEOJSON(point_geom) を選択します。

クエリ結果:

2. 新しいポイント情報を追加します。クライアントから送信されたポイントジオメトリ文字列は、挿入する前にST_GEOMFROMTEXT関数を使用して処理する必要があります。そうしないと、エラーが報告されます。

クライアントがポイント情報を送信する

{
    "point_name":"新帥グループ監視ポイント",
    "geotext":"POINT(117.420671499 40.194914201)"}
}

エラー例:

meteorological_point(point_name, point_geom) に値を挿入します("Xinshuai Group Monitoring Point", "POINT(117.420671499 40.194914201)")

エラー 1416 - GEOMETRY フィールドに送信したデータからジオメトリ オブジェクトを取得できません

正しい挿入SQL:

meteorological_point(point_name, point_geom) に値を挿入します("Xinshuai Group Monitoring Point", ST_GEOMFROMTEXT("POINT(117.420671499 40.194914201)"))

3. 新しいポイントを追加します。クライアントから送信されたポイントの形式は geojson 形式です。挿入する前に、ST_GeomFromGeoJSON 関数で処理する必要があります。

クライアントがポイント情報を送信する

{
    "point_name":"民間爆発物会社監視ポイント",
    "geojson":"{"type": "ポイント", "座標": [117.410671499, 40.1549142015]}"}
}

SQLを挿入

meteorological_point(point_name, point_geom) に値を挿入します("Minbao Company Monitoring Point", ST_GeomFromGeoJSON("{\"type\": \"Point\", \"coordinates\": [117.410671499, 40.1549142015]}"))

空間データフォーマットの概要

mysql geometryデータストレージでは、ストレージの前にgeometryテキストまたはgeojsonの関数処理が必要です。そうしないとエラーが報告されます。クエリを実行するときは、フォーマット関数を使用してgeojsonに変換し、サーバー側の転送とクライアント側のフレームワーク解析を容易にします。

2. 空間分析

前のセクションでは、空間関数の保存、クエリのフォーマットと関連操作を紹介し、空間データ構造と geojson について学習しました。このセクションでは、空間データ処理関数のアプリケーションを紹介します。

1. ポイントと半径に基づいてバッファゾーンを生成する

バッファは、マップ機能で非常に一般的な機能です。まず、特定の範囲のポイント、ライン、サーフェスのカバーエリアを表示するために使用できます。次に、いくつかの分析シナリオでは、位置座標情報とバッファ半径がわかっており、地理検索のクエリ条件としてバッファが生成されます。

ST_ASGEOJSON(ST_BUFFER(ST_GeomFromGeoJSON('${geojsonStr}'),${radius})) を選択します

SQL 解釈

呼び出し元は、geojson 文字列と半径 (メートル) を渡します。ST_GeomFromGeoJSON ST_GeomFromGeoJSONgeojson文字列をデータベース内のgeometryに処理するために使用されます。次に、 ST_BUFFER(geometry , radius) を使用して、バッファ スペース データを生成します。この関数はジオメトリと同じ形式を返すため、 ST_ASGEOJSON関数がラップされ、返された結果を geojson に処理して、クライアントが簡単に読み取り、レンダリングできるようにします。

例:

  • バッファ半径が 50 メートルのポイント geojson 文字列 "{"type": "Point", "coordinates": [117.410671499, 40.1549142015]}" があります (注: パラメータの地理情報と ST_BUFFER() の戻り値はすべてメルカトル座標系です。geojson がメルカトル座標系でない場合は、ツール クラスを使用して変換する必要があります)
パブリッククラス MercatorUtils {
    /**
     * ポイント GeoJSON をメルカトル図法に変換*
     * @param ポイント
     * @戻る
     */
    パブリック静的JSONObject point2Mercator(JSONObject point) {
        JSONArray xy = point.getJSONArray(座標);
        JSONArray メルカトル = lngLat2Mercator(xy.getDouble(0), xy.getDouble(1));
        point.put(座標、メルカトル);
        戻りポイント;
    }
    /**
     * 緯度と経度をメルカトル図法に変換*/
    パブリック静的JSONArray lngLat2Mercator(double lng, double lat) {
        ダブルx = lng * 20037508.342789 / 180;
        ダブル y = Math.log(Math.tan((90 + lat) * M_PI / 360)) / (M_PI / 180);
        y = y * 20037508.34789 / 180;
        JSONArray xy = 新しいJSONArray();
        xy を追加します。
        xy を追加します。
        xy を返します。
    }
    
    /**
     * メルカトル座標系データを通常の座標系に変換する*/
    パブリック静的JSONObject mercatorPolygon2Lnglat(JSONObject polygon) {
        JSONArray 座標 = polygon.getJSONArray(COORDINATES);
        JSONArray xy = 座標.getJSONArray(0);
        JSONArray ms = 新しい JSONArray();
        (int i = 0; i < xy.size(); i++) の場合 {
            JSON配列 p = xy.getJSONArray(i);
            JSONArray m = mercator2lngLat(p.getDouble(0), p.getDouble(1));
            ms.add(m);
        }
        JSONArray の新しい座標 = 新しい JSONArray();
        新しい座標を追加します(ms);
        polygon.put(座標、新しい座標);
        ポリゴンを返します。
    }
}

変換されたgeojson 、上記のバッファの sql として使用して、バッファ空間データを生成することができます。生成されたバッファ データもメルカトル座標系であり、クライアントに返される前に、 mercatorPolygon2Lnglatを使用して処理する必要があります。呼び出しプロセスは次のとおりです。

  • クライアントはポイントのgeojsonと半径を送信します
  • メルカトルツールクラスを使用して、ポイントのgeojsonメルカトル座標系のgeojsonに変換します。
  • バッファを生成するためにSQLを呼び出す
  • 戻り値はメルカトルツールクラスを使用してmercatorPolygon2Lnglatに変換され、呼び出し元に返されます。

まとめ:

上記では、 mysql st_buffer関数を使用してバッファを生成する方法について説明しました。実際の操作では、研究開発での私のアプリケーション後に実現可能です。実際の開発では、geotools などのツールキットを使用してバッファ生成を実現することもできます...

3. ポイントが位置する都市を特定する

  • ユーザーのポイントが位置する都市を特定します - クライアントはユーザーの位置情報を送信し、ユーザーが位置する都市を特定します (ST_INTERSECTS() を使用して 2 つのジオメトリが交差するかどうかを特定し、0 または 1 を返します)
ST_INTERSECTS(ST_GeomFromGeoJSON('${geoJsonStrA}'), ST_GeomFromGeoJSON('${geoJsonStrB}')) を選択します

SQL 解釈:

フォーマット関数を使用してgeojson関数がサポートするジオメトリ形式に変換し、 ST_INTERSECTSを使用して判断します。

4. よく使われる空間関数

要約:

MySQL 、空間データの保存と分析のためのさまざまなデータ型と関数を提供します。このような関数を学習すると、地理情報をより適切に処理できるようになります。それらを使用する前に、落とし穴を避けるために座標系とgeojson関連の知識を理解する必要があります。関連する質問がある場合は、コメントエリアでコミュニケーションすることもできます。誤解がある場合は、修正してください。

これで、MySQL 空間データ ストレージと関数に関するこの記事は終了です。MySQL 空間データ ストレージと関数に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL でのストアド プロシージャと関数の作成の詳細な説明
  • MySQL ストアドプロシージャとストアドファンクションの詳細な説明
  • MYSQL ストアドプロシージャと関数の簡単な記述
  • MySQL ストアド関数の詳細な紹介

序文:

少し前に、地図関連のバックエンド プロジェクトを開発しました。このプロジェクトでは、いくつかの点線面の保存、クエリ、および分析操作が必要でした。そのため、MySQL の空間関数を徹底的に調査し、プロジェクトに適用しました。MySQL は、空間データの保存と処理のために専用の型ジオメトリ (すべての空間構造をサポート) と、さらに細分化された型PointLineStringPolygonMultiPointMultiLineStringMultiPolygonなどを提供しています。空間関数について学習し、この型を使用して経度と緯度の保存とルートの保存を行い、関連する空間関数を使用して分析を行うことができます。以下のデータベース操作はすべて、 MySQL5.7.20に基づいています。

1. データ型

1. MySQL空間データとは何か

  • MySQL は、座標情報を格納するためのgeometryデータ型を提供します。ジオメトリ型は、次の 3 種類のデータ ストレージをサポートします。

<<:  Vue px to rem 構成の詳細な説明

>>:  HTML タグのネスト規則の紹介

推薦する

Linux のさまざまなロックメカニズムの使用方法と違いについて詳しく説明します

序文:この知識を理解する必要がある人は、すでにプロセス間通信とスレッド間通信の基本的な理解を持ってい...

...

Vueドロップダウンリストの2つの実装方法の比較

Vueドロップダウンリストの2つの実装最初の方法はv-forを使用する <el-select ...

Tomcat を IDEA にダウンロード、インストール、デプロイするチュートリアル (IDEA の 2 つのホット デプロイ設定方法付き)

目次Tomcat ダウンロードチュートリアルTomcat インストールチュートリアルTomcat の...

MySQL テーブルの断片化を解消し、スペースを再利用する方法

目次MySQL テーブルの断片化の原因行の断片化行内断片化空き領域の断片化MySQL で極度に断片化...

HTML ヘッド構造

以下では、よく使われるヘッド構造と、各タグや要素の意味や使用シーンを紹介します(この記事は、Yisi...

JavaScriptでよく使われる配列重複排除実戦ソースコード

アレイの重複排除は、通常、就職面接中に遭遇し、アレイの重複排除方法のコードを手動で記述することが求め...

Amoeba を使用して MySQL データベースの読み取り/書き込み分離を実装する方法の詳細な説明

MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...

Linux テキスト検索コマンド find の詳細な使用方法

find コマンドは主にディレクトリやファイルを検索するために使用され、一致のために複数のパラメータ...

Vue3 の組み合わせ API における setup、ref、reactive の完全な使用方法

1. セットアップを始める次のコード関数を簡単に紹介します。 ref 関数を使用して変数の変更を監視...

Ubuntu MySQL バージョンが 5.7 にアップグレードされました

数日前、図書館はサーバー(Ubuntu 14.04)にセキュリティ上の脆弱性があり、時間通りに修復さ...

Windows10でmysql8.0.17を置き換える詳細なチュートリアル

この記事では、Windows10でmysql8.0.17を置き換える具体的な手順を参考までに紹介しま...

訪問者を惹きつけるウェブサイトコンテンツを作成する14の方法

ネットサーフィンをしていると、私の注意を引こうとする美しいグラフィックでいっぱいの Web サイトを...

js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

従来の解決策FileReader を使用して UTF-8 形式のファイルを読み取り、ファイルの内容に...

CocosCreatorプロジェクト構造の仕組みの詳細な説明

目次1. プロジェクトフォルダ構造1. アセットフォルダ2. 図書館3. ローカル設定(ローカル) ...