sql >> データベース >  >> RDS >> Mysql

ジオロケーションMySQLクエリ

    問題は、データベースにデータを保存する方法が、実行しているタスクのタイプに適していないことです。 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
    ;
    



    1. 名前に角かっこが含まれているSQLServerの名前を変更するにはどうすればよいですか?

    2. mysqlでの条件付き結合

    3. 単一行の値を合計しますか?

    4. 組織にとってデータバックアップが重要である理由