Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Định vị địa lý truy vấn MySQL

Vấn đề là cách bạn đang lưu trữ dữ liệu trong cơ sở dữ liệu không phù hợp với loại tác vụ bạn đang thực hiện. Sử dụng Point các giá trị trong Geometry điểm dữ liệu là con đường để đi. Thực tế đã mã hóa thứ gì đó hơn 4 năm trước cho mục đích này, nhưng gặp vấn đề khi tìm kiếm nó. Nhưng bài đăng này có vẻ như đã che đậy nó tốt.

CHỈNH SỬA Được rồi, tôi đã tìm thấy mã cũ của mình, nhưng nó đang đề cập đến dữ liệu khách hàng cũ mà tôi rõ ràng là không thể chia sẻ. Nhưng chìa khóa để tăng tốc độ với tọa độ trong cơ sở dữ liệu là sử dụng POINT dữ liệu được lưu trữ trong bảng cơ sở dữ liệu với kiểu GEOMETRY . Thêm chi tiết tại đây trên trang MySQL chính thức. Vì tôi cần lý do để truy cập lại loại mã này - và các khái niệm - nên đây là một tập lệnh MySQL nhanh mà tôi đã sử dụng để tạo một bảng mẫu với dữ liệu mẫu để truyền đạt các khái niệm cơ bản. Khi bạn hiểu điều gì đang xảy ra, nó sẽ mở ra rất nhiều lựa chọn thú vị.

Cũng tìm thấy lời giải thích tuyệt vời / đơn giản này của khái niệm.

Và tìm thấy một đánh giá tuyệt vời khác về dữ liệu không gian trong MySQL 5.6. Nhiều thông tin tuyệt vời về chỉ mục và hiệu suất. Cụ thể về hiệu suất chỉ mục không gian MySQL:

Và mặt khác của điều đó:

Và đây là các tập lệnh kiểm tra MySQL cơ bản của tôi để giúp minh họa khái niệm:

/* 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - cách hiển thị chủ đề mới nhất trên mỗi luồng

  2. Làm cách nào để truy vấn giữa hai ngày bằng MySQL?

  3. Chèn hình ảnh vào cơ sở dữ liệu bằng php

  4. Tìm kiếm MySQL và thay thế một số văn bản trong một trường

  5. MySQL:Tìm các hàng không tham gia vào mối quan hệ