問題は、データベースにデータを保存する方法が、実行しているタスクのタイプに適していないことです。 Point
の使用 Geometry
の値 データポイントは行く方法です。実際には、この目的のために4年以上前に何かをコーディングしましたが、それを見つけるのに問題があります。ただし、この投稿 うまくカバーしているようです。
編集 さて、私の古いコードを見つけましたが、それは明らかに私が共有できない古いクライアントデータを参照しています。ただし、データベースの座標を高速化するための鍵は、POINT
を使用することです。 GEOMETRY
のタイプでデータベーステーブルに格納されているデータ 。 詳細はこちら
MySQLの公式サイトにあります。このタイプのコードと概念を再検討する理由が必要だったので、ここに、基本的な概念を伝えるためのサンプルデータを含むサンプルテーブルを作成するための簡単なMySQLスクリプトを示します。何が起こっているのかを理解すると、たくさんのクールなオプションが開かれます。
このすばらしい/簡単な説明 コンセプトも。
そして、空間データのもう1つの優れた評価 MySQL5.6で。インデックスとパフォーマンスに関する多くの優れた情報。特にMySQL空間インデックスのパフォーマンスに関して:
そしてその反対側:
そして、これが概念を説明するのに役立つ私の基本的なMySQLテストスクリプトです:
/* Create the database `spatial_test` */
CREATE DATABASE `spatial_test` CHARACTER SET utf8 COLLATE utf8_general_ci;
/* Create the table `locations` in `spatial_test` */
CREATE TABLE `spatial_test`.`locations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`coordinates` point NOT NULL,
UNIQUE KEY `id` (`id`),
SPATIAL KEY `idx_coordinates` (`coordinates`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
/* Insert some test data into it. */
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(27.174961 78.041822)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(27.985818 86.923596)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(44.427963 -110.588455)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(19.896766 -155.582782)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(40.748328 -73.985560)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(40.782710 -73.965310)'));
/* A sample SELECT query that extracts the 'latitude' & 'longitude' */
SELECT x(`spatial_test`.`locations`.`coordinates`) AS latitude, y(`spatial_test`.`locations`.`coordinates`) AS longitude FROM `spatial_test`.`locations`;
/* Another sample SELECT query calculates distance of all items in database based on GLength using another set of coordinates. */
SELECT GLength(LineStringFromWKB(LineString(GeomFromText(astext(PointFromWKB(`spatial_test`.`locations`.`coordinates`))), GeomFromText(astext(PointFromWKB(POINT(40.782710,-73.965310))))))) AS distance
FROM `spatial_test`.`locations`
;
/* Yet another sample SELECT query that selects items by using the Earth’s radius. The 'HAVING distance < 100' equates to a distance of less than 100 miles or kilometers based on what you set the query for. */
/* Earth’s diameter in kilometers: 6371 */
/* Earth’s diameter in miles: 3959 */
SELECT id, (3959 * acos(cos(radians(40.782710)) * cos(radians(x(`spatial_test`.`locations`.`coordinates`))) * cos(radians(y(`spatial_test`.`locations`.`coordinates`)) - radians(-73.965310)) + sin(radians(40.782710)) * sin(radians(x(`spatial_test`.`locations`.`coordinates`))))) AS distance
FROM `spatial_test`.`locations`
HAVING distance < 100
ORDER BY id
;