MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

序文

プロジェクトの要件は、ユーザーの現在の位置が特定の地理的位置範囲内にあるかどうかを判断することです。位置制限が満たされている場合にのみ、ユーザーはチェックインできます。位置範囲は、1 つ以上の不規則なポリゴンです。下の図に示すように、ユーザーが清華大学にいるのか北京大学にいるのかを判別します。

グラフィック領域の座標を取得する#

プロジェクトのフロントエンドは、WeChat アプレットの wx.getLocation を使用して地理的位置を取得するため、座標の一貫性を確保するために、背景選択領域では Tencent Maps の地理的位置サービスを使用します。アプリケーション ツール -> 図形の描画では、点、線、多角形、円が提供されており、簡単に選択できます。こちらをご覧ください。

選択した位置座標を取得するには、公式の例を少し変更します。

保管場所

座標位置を取得した後、次のステップはそれをどのように保存するかです。

Open Geospatial Consortium (OGC) は、空間データを管理する幅広いアプリケーションで使用できる公開空間ソリューションの開発に携わる 250 社以上の企業、機関、大学からなる国際連合です。 OGC は地理情報用の OpenGIS® 実装標準を公開しており、OGC Web サイト (http://www.opengeospatial.org/standards/sfs) から入手できます。 OGC 仕様に準拠するために、MySQL はジオメトリ タイプ環境を使用して SQL のサブセットとして空間拡張を実装し、空間の生成、保存、分析の機能を提供します。つまり、MySQL は私たちのニーズを満たすことができます。
MySQL は、幾何学的なポイント、ライン、ポリゴンに対応する個別のストレージ タイプ POINT、LINESTRING、および POLYGON を提供します。GEOMETRY は、これら 3 つのいずれかを格納できます。複数の型を格納する機能もあります。MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION は、単一のグラフィックの複数形に対応します。

プロジェクトに戻ると、POLYGON を使用しました。

テーブル作成ステートメントは次のとおりです。

テーブル `polygon` を作成します (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 `name` varchar(255) デフォルト NULL,
 `polygon` ポリゴン NOT NULL、
 主キー (`id`)、
 空間キー `d` (`polygon`)
) デフォルト文字セット=utf8;

データの挿入

MySQL は、Well-Known Text (WKT) および Well-Known Binary (WKB) 形式をオブジェクト型に変換して保存することをサポートしています。ここでは、より理解しやすい WKT 形式を使用します。 WKBに興味のある方はこちらをご覧ください。

挿入ステートメントは次のとおりです。

`polygon` に値 ('1'、'清華大学'、GeomFromText('POLYGON((
40.01169924229143 116.31565081888039,39.99304082299905 116.31616541796757,39.99343506780591 116.33297565023167,40.00237067000859 116.33743550702275,40.01340715321479 116.33057418815224,40.01169924229143 116.31565081888039))'));

`polygon` に INSERT INTO VALUES ('2', '北京大学', GeomFromText('POLYGON((39.99711457525893 116.30450117461078,39.98673259872773 116.30535884106575,39.98673259872773 116.31702308311287,39.99963848242885 116.31598375134854,39.99711457525893 116.30450117461078))'));

Tencent Maps によって返されるポリゴンのポイントは閉じられていないことに注意してください。ポリゴン関数では、ポリゴンが閉じているかどうかを判断するために、最初のポイントと最後のポイントが同じである必要があります。ポリゴンが閉じていない場合、返される結果は NULL になり、挿入ステートメントは失敗します。

ジオメトリは、次のリスト(網羅的ではない)のような条件を満たす場合、構文的に整形式です。

  • ラインストリングには少なくとも2つのポイントがあります
  • 多角形には少なくとも1つのリングがある
  • 多角形リングは閉じている(最初の点と最後の点が同じ)
  • 多角形リングには少なくとも 4 つの点があります (最小の多角形は、最初の点と最後の点が同じ三角形です)
  • コレクションは空ではありません (GeometryCollection を除く)

クエリの判断

SELECT * FROM ポリゴン WHERE
	MBRWithin (ST_GeomFromText('POINT(39.991333490218544 116.30964748487895)'), ポリゴン);
# SELECT * FROM polygon WHERE in 北京大学
	MBRWithin (ST_GeomFromText('POINT(39.988967560246685 116.3286905102832)'), ポリゴン);
# 北京大学ではない

注意深い学生は、ここでのクエリ ステートメントが関数を使用していることに気付いたかもしれません。以前の SQL では、クエリ フィールドで関数を使用すると、必然的にインデックス エラーと完全なテーブル スキャンが発生しますが、空間データではこれは発生しません。まず、EXPLAIN ステートメントと結果を見てみましょう。

MySQLの空間データもインデックス化でき、使用されるキーワードはSPATIALであることがわかります。

使用方法は次のとおりです。

テーブル geom を作成します (g GEOMETRY NOT NULL);
geom(g) に空間インデックス g を作成します。

よく使われる空間計算関数

1. 2点間の距離を求める

ST_Distance(g1, g2) は g1 と g2 間の距離を返します。いずれかの引数が NULL または空のジオメトリの場合、戻り値は NULL になります。

2. グラフィック 1 はグラフィック 2 を完全に含んでいますか?

ST_Contains(g1, g2) g1 に g2 が完全に含まれてるかどうかを示す 1 または 0 を返します。同じ効果を得るために、ST_Within(g2,g1) を使用することもできます。

3. 交差点なし

ST_Disjoint(g1, g2) g1 が g2 と空間的に分離している (交差していない) かどうかを示す 1 または 0 を返します。

4. 図形の交差の状況は、重なり、外部交差など、より複雑です。詳細はこちらをご覧ください。

要約する

この記事では、MySQL の組み込み Polygon データ型を使用して、地理的位置のチェックイン要件を通じて空間データを格納します。ST_Contains(g1, g2) 関数は、バックグラウンドで事前に設定された地理的領域とフロントエンドで取得されたユーザーの地理的位置を置き換えて、ユーザーがチェックイン範囲内にいるかどうかを判断します。また、MySQL では、関数をクエリ フィールドとして使用するときに引き続きインデックスを使用でき、最終的に他の空間処理関数も拡張されます。

これで、MySQL 空間関数を使用してロケーション パンチインを実装する方法に関するこの記事は終了です。MySQL 空間関数のロケーション パンチインに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 無制限レベル分類実装のアイデア
  • MySQLはインデックスを使用してクエリを最適化します
  • MySQL を使用して実装されたスノーフレーク アルゴリズムのケース

<<:  Linux chkconfig コマンドの使用

>>:  JavaScript ループトラバーサルの 24 種類のメソッドをすべてご存知ですか?

推薦する

Vue diffアルゴリズムの完全な分析

目次序文Vue 更新ビューパッチ同じVノードパッチVノード更新子供序文Vue は仮想 DOM を使用...

モバイルページで縦画面を強制する方法

最近、仕事でモバイルページを作成しました。もともと特別なことではありませんでしたが、非常に奇妙に感じ...

Dockerコンテナでユーザーを分離する方法

前回の記事「Docker コンテナの UID と GID を理解する」では、Docker コンテナ内...

JavaScript フロー制御 (分岐)

目次1. プロセス制御2. シーケンシャルプロセス制御3. 分岐フロー制御if文1. 支店構造2. ...

JSはマップを使用してdouble配列を統合します

目次序文データのシミュレーション結合されたデータ合併のアイデアコードの表示と分析最初のステップステッ...

jsはクリックしてカードを切り替える機能を実現します

この記事の例では、クリックしてカードを切り替える機能を実現するためのjsの具体的なコードを共有してい...

jQueryは検証コード送信のコントロールボタンを無効にする機能を実装します

必要な効果: 確認コードを送信するためにクリックした後、ボタンは無効になり、5 秒後に無効解除されま...

Vue2.x の応答性の簡単な説明と例

1. Vue レスポンシブの使用法を確認する​ Vue の応答性は、私たち全員がよく知っています。 ...

iptables の再起動後に Docker の iptables ルールの完全なプロセスが失われる

原因と結果1. ansibleコマンドを使用してジャンプサーバー上のマシンBをテストすると、次のエラ...

Linux で複数のファイルの名前を一度に変更する方法

序文日常業務では、すべての jpg ファイルを bnp に変更したり、名前の 1 を one に変更...

Docker コンテナのネットワーク障害に対する 6 つの解決策

Docker コンテナのネットワーク障害に対する 6 つの解決策注: 以下の方法は、コンテナ内のパブ...

黒、白、グレーの控えめでエレガントなウェブデザインを鑑賞

クラシックな色の組み合わせの中でも、黒、白、グレーの時代を超えた魅力を否定できる人はおそらくいないで...

MySQL のデータの偶発的な削除の解決策と kill ステートメントの原則

mysql が誤ってデータを削除しました削除ステートメントを使用して誤ってデータ行を削除する誤ってデ...

Windows 10 での MySQL 8.0.20 のインストールと設定方法のグラフィック チュートリアル

Win10システムにMySQL8.0.20をローカルにインストールし、個人的にテストして利用可能であ...

Vueカスケードドロップダウンボックスの設計と実装

目次1. データベース設計2. フロントエンドページ3. 完全なデモフロントエンド開発では、カスケー...