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 タグのネスト規則の紹介

推薦する

Hbase 入門

1. HBaseの概要1.1 HBaseとはHBase は、高い信頼性、高いパフォーマンス、列ストレ...

ウェブメッセージボード機能を実現するjs

この記事の例では、Webメッセージボードを実装するためのjsの具体的なコードを参考までに共有していま...

Vue プロジェクト @change 複数のパラメータを使用して複数のイベントを渡す

まず、変更イベントは 1 つだけです。 changelevel() //値を選択選択を変更して行の値...

CentOS7.4 に MySQL 5.7.26 をインストールするための詳細なチュートリアル

CentOS にはデフォルトで MariaDB がインストールされていますが、これは MySQL の...

Vueはランニングライトのシンプルな効果を実現

この記事では、マーキーのシンプルな効果を実現するためのVueの具体的なコードを参考までに共有します。...

JavaScript で動的な QML オブジェクトを作成する方法

1. オブジェクトを動的に作成するJavaScript からオブジェクトを動的に作成する方法は 2 ...

ネイティブJavaScriptカルーセル実装方法

この記事では、JavaScriptカルーセルの実装方法を参考までに紹介します。具体的な内容は次のとお...

Vueカスタムカプセル化ボタンコンポーネント

Vueボタンコンポーネントのカスタムカプセル化コードは参考用です。具体的な内容は次のとおりです。ボタ...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

Vue はタブ ラベルを実装します (ラベルが自動スクロールを超える)

作成されたタブラベルがページの表示領域を超えると、タブラベルの距離だけ自動的にスクロールされます。ま...

Mysql の読み取り/書き込み分離期限切れに対する一般的な解決策

MySQLの読み書き分離の落とし穴読み取りと書き込みの分離の主な目的は、メイン データベースの負荷を...

ウェブページレイアウトデザインのシンプルな原則

この記事では、Web ページ レイアウト デザインのいくつかの簡単な原則をまとめ、Web ページ デ...

ウェブページをデザインするには?ウェブページを作成するには?

Web デザインの理解に関しては、多くの人がまだ Web ページ制作のレベルにとどまっているようで...

MySQLデータベースとOracleデータベース間のバックアップをインポートする

OracleデータベースからエクスポートされたデータをMySqlデータベースにインポートします。 1...

UbuntuにCMakeをインストールするいくつかの方法の詳細な説明

CMakeをインストール sudo apt をインストール cmake この方法はインストールが簡単...