PostGISやMongoDBも?MySQL以外の選択肢:緯度経度を保存する最適なデータベース
MySQLで緯度経度を保存する精度
必要な精度
緯度経度を保存する際の必要な精度は、アプリケーションによって異なります。例えば、以下のような点を考慮する必要があります。
- 表示精度: 地図などに表示する場合、必要な精度が低い場合があります。
- 検索精度: 緯度経度を基に検索する場合、ある程度の精度が必要です。
- データ量: 精度を上げると、保存するデータ量が増えます。
一般的に推奨される精度
一般的には、以下の精度が推奨されています。
- 緯度: 6桁 (小数点以下3桁)
この精度であれば、多くの場合十分な精度で緯度経度を保存できます。
データ型
緯度経度を保存するデータ型は、以下のいずれかを使用できます。
- DECIMAL: 必要な精度を指定できます。
- DOUBLE: 64ビット浮動小数点数を保存できます。精度が十分であれば、こちらを使用しても良いでしょう。
- GEOMETRY: 空間データを保存するデータ型です。緯度経度以外にも、ポリゴンなどの形状を保存できます。
インデックス
緯度経度を基に検索する場合は、インデックスを作成しておくとパフォーマンスが向上します。
GeoHashは、緯度経度を基に16進数の文字列に変換する符号化方式です。GeoHashを使用すると、緯度経度を短縮して保存することができます。また、GeoHashを使用することで、近隣の緯度経度を効率的に検索することができます。
MySQL 8.0には、空間データを扱うための新機能がいくつか追加されています。例えば、以下の機能があります。
- ST_GeFromText: 文字列から空間データを作成する関数です。
- ST_Distance: 2つの空間データ間の距離を計算する関数です。
- ST_Contains: ある空間データが別の空間データに含まれているかどうかを判断する関数です。
これらの新機能を使用することで、より高度な空間データ処理を行うことができます。
MySQLで緯度経度を保存するサンプルコード
CREATE TABLE locations (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
lat DECIMAL(8,6) NOT NULL,
lng DECIMAL(9,6) NOT NULL
);
INSERT INTO locations (name, lat, lng) VALUES
('東京', 35.6895, 139.6917),
('京都', 35.0164, 135.7577),
('大阪', 34.6938, 135.5022);
SELECT * FROM locations;
このコードは、以下のことを行います。
locations
という名前のテーブルを作成します。- このテーブルには、
id
、name
、lat
、lng
という4つのカラムがあります。 id
カラムは主キーであり、自動的にインクリメントされます。name
カラムは、場所の名前を保存します。- テーブルに3つのレコードを挿入します。
- テーブル内のすべてのレコードをSELECTします。
このコードは、緯度経度をDECIMAL
型で保存しています。この型は、必要な精度を指定することができます。
GeoHashを使用する場合は、以下のコードのように変更する必要があります。
CREATE TABLE locations (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
geohash VARCHAR(23) NOT NULL
);
INSERT INTO locations (name, geohash) VALUES
('東京', '9q2d2z298f26b'),
('京都', '9q28b2z298f2'),
('大阪', '9q29b2z298f2');
SELECT * FROM locations;
このコードは、緯度経度をGeoHashに変換して保存しています。GeoHashは、16進数の文字列で表されます。
CREATE TABLE locations (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
point POINT NOT NULL
);
INSERT INTO locations (name, point) VALUES
('東京', ST_PointFromText('POINT(139.6917 35.6895)')),
('京都', ST_PointFromText('POINT(135.7577 35.0164)')),
('大阪', ST_PointFromText('POINT(135.5022 34.6938)'));
SELECT * FROM locations;
このコードは、緯度経度を空間データ型に変換して保存しています。空間データ型は、緯度経度以外にも、ポリゴンなどの形状を保存することができます。
MySQLで緯度経度を保存するその他の方法
ST_Geography型は、空間データ型の中でも、より多くの機能を備えたデータ型です。例えば、以下の機能があります。
- ポリゴンのような複雑な形状を保存することができます。
- 空間データ間の距離や角度を計算することができます。
- 空間データに対して、様々な演算を実行することができます。
CREATE TABLE locations (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
geom ST_Geography NOT NULL
);
INSERT INTO locations (name, geom) VALUES
('東京', ST_GeomFromText('POLYGON((139.57, 35.68), (139.72, 35.68), (139.72, 35.73), (139.57, 35.73), (139.57, 35.68))')),
('京都', ST_GeomFromText('POLYGON((135.71, 35.00), (135.78, 35.00), (135.78, 35.06), (135.71, 35.06), (135.71, 35.00))')),
('大阪', ST_GeomFromText('POLYGON((135.45, 34.65), (135.52, 34.65), (135.52, 34.71), (135.45, 34.71), (135.45, 34.65))'));
SELECT * FROM locations;
RDBMS以外のデータベースを使用する
緯度経度を保存する専用のデータベースを使用することもできます。例えば、以下のようなデータベースがあります。
- PostGIS: PostgreSQL用の空間拡張機能です。
- MongoDB: NoSQLデータベースですが、空間データの保存にも対応しています。
- Redis: キー-バリューストアですが、GeoHashなどの空間データ構造をサポートしています。
これらのデータベースは、MySQLよりも空間データ処理に特化しており、より高度な機能を提供している場合があります。
注意事項
緯度経度を保存する際には、以下の点に注意する必要があります。
- 必要な精度を決定する必要があります。
- 適切なデータ型を選択する必要があります。
- 必要に応じて、インデックスを作成する必要があります。
- 空間データ処理を行う場合は、適切なライブラリを使用する必要があります。
mysql geolocation