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

推薦する

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭...

Linuxネットワーク設定の基本操作コマンドを詳しく解説

目次ネットワーク構成を表示するネットワークインターフェース情報を表示する---ifconfigルーテ...

Linux 圧縮ファイルコマンド zip の使用例

「.zip」形式は、Windows システムでファイルを圧縮するために使用されます。実際、「.zip...

mysql 5.7.20 win64 のインストールと設定方法

mysql-5.7.20-winx64.zipインストール手順のないインストール パッケージ: ht...

Linux whatisコマンドの使い方

01. コマンドの概要whatis コマンドは、システム コマンドの簡単な説明を含むいくつかの特別な...

Tomcat8はcronologを使用してCatalina.Outログを分割します

背景tomcat によって生成された catalina.out ログ ファイルが分割されていない場合...

HTML の doctype とエンコーディングに関する簡単な説明

文書タイプDoctype は、指示を解析するためにどのバージョンの HTML を使用するかをブラウザ...

Linux CentOS でスケジュールされたバックアップ タスクを設定する方法

実装準備 # ファイルパスをバックアップする必要があります: /opt/apollo/logs/ac...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...

キープアライブキャッシュをクリアする方法の詳細なグラフィック説明

目次オープニングシーンv-for を使用した直接レンダリングカスタムコンポーネントで直接レンダリング...

MySQLデータベース移行により、大量のデータを迅速にエクスポートおよびインポートできます

データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...

YUM を使用して Linux (CentOS 7) に MySQL 5.7.18 をインストールする方法の詳細なチュートリアル

このプロジェクトでは MySQL を使用する必要があります。これまで Windows では常に確実に...

H5ウェイクアップアプリの実装方法と注意点のまとめ

目次序文APPメソッドにジャンプURLスキームメタタグユニバーサルリンクさまざまな使い方URLスキー...

MySQL 8.0 の binlog の詳細な説明

1 はじめにバイナリ ログは、データを持つ、またはデータを変更する可能性がある SQL ステートメン...

Linuxはjoin -a1を使用して2つのファイルを結合します

次の2つのファイルを結合するには、それらを結合して1.txtに結合します。 # 1.txt ジェリー...