Hướng dẫn how to store location in mysql - cách lưu trữ vị trí trong mysql

TL;DR

Sử dụng Float (8,5) nếu bạn không làm việc trong NASA / quân đội và không chế tạo hệ thống máy bay Navi.


Để trả lời đầy đủ câu hỏi của bạn, bạn cần xem xét một số điều:

Định dạng

  • độ: 40° 26′ 46″ N 79° 58′ 56″ W
  • Biên bản thập phân: 40 ° 26.767 N 79 ° 58.933 W W: 40° 26.767′ N 79° 58.933′ W
  • độ thập phân 1: 40.446 ° N 79,982 ° W: 40.446° N 79.982° W
  • độ thập phân 2: -32.60875, 21.27812: -32.60875, 21.27812
  • Một số định dạng làm nhà khác? Không ai cấm bạn tạo hệ thống tọa độ trung tâm nhà của riêng bạn và lưu trữ nó như là hướng đến và khoảng cách từ nhà của bạn. Điều này có thể có ý nghĩa đối với một số vấn đề cụ thể mà bạn đang làm việc.

Vì vậy, phần đầu tiên của câu trả lời sẽ là - bạn có thể lưu trữ tọa độ theo định dạng ứng dụng của bạn sử dụng để tránh chuyển đổi liên tục qua lại và thực hiện các truy vấn SQL đơn giản hơn.

Hầu hết có lẽ bạn sử dụng Google Maps hoặc OSM để hiển thị dữ liệu của mình và GMAP đang sử dụng định dạng "độ 2 của thập phân 2". Vì vậy, sẽ dễ dàng hơn để lưu trữ tọa độ theo cùng một định dạng.

Độ chính xác

Sau đó, bạn muốn xác định độ chính xác mà bạn cần. Tất nhiên bạn có thể lưu trữ các tọa độ như "-32.608697550570334,21.278081997935146", nhưng bạn đã bao giờ quan tâm đến milimet trong khi điều hướng đến điểm chưa? Nếu bạn không làm việc ở NASA và không làm vệ tinh hoặc tên lửa hoặc quỹ đạo máy bay, bạn sẽ ổn với độ chính xác vài mét.

Định dạng thường được sử dụng là 5 chữ số sau các dấu chấm mang lại độ chính xác 50cm.

Ví dụ: Có khoảng cách 1cm giữa X, 21.2780818 và X, 21.2780819. Vì vậy, 7 chữ số sau khi DOT cung cấp cho bạn độ chính xác 1/2cm và 5 chữ số sau khi DOT sẽ cung cấp cho bạn độ chính xác 1/2 mét (vì khoảng cách tối thiểu giữa các điểm riêng biệt là 1m, do đó, lỗi làm tròn không thể hơn một nửa). Đối với hầu hết các mục đích dân sự, nó là đủ.8 and X,21.2780819. So 7 digits after dot give you 1/2cm precision and 5 digits after dot will give you 1/2 meters precision (because minimal distance between distinct points is 1m, so rounding error cannot be more than half of it). For most civil purposes it should be enough.

độ của số lượng thập phân định dạng (40 ° 26.767 N 79 ° 58.933 W) cung cấp cho bạn độ chính xác giống như 5 chữ số sau khi chấm

Lưu trữ hiệu quả không gian

Nếu bạn đã chọn định dạng thập phân, thì tọa độ của bạn là một cặp (-32.60875, 21.27812). Rõ ràng, 2 x (1 bit cho dấu hiệu, 2 chữ số cho độ và 5 chữ số cho số mũ) sẽ là đủ.

Vì vậy, ở đây tôi muốn hỗ trợ Alix Axel từ các bình luận nói rằng đề xuất của Google để lưu trữ nó trong phao (10,6) thực sự là thêm, bởi vì bạn không cần 4 chữ số cho phần chính (vì dấu hiệu được tách ra và Latitude bị hạn chế đến 90 và kinh độ được giới hạn ở 180). Bạn có thể dễ dàng sử dụng phao (8,5) cho độ chính xác 1/2m hoặc phao (9,6) cho độ chính xác 50/2cm. Hoặc thậm chí bạn có thể lưu trữ LAT và dài trong các loại tách, vì Float (7,5) là đủ cho LAT. Xem tham chiếu loại float MySQL. Bất kỳ ai trong số họ sẽ giống như phao bình thường và bằng 4 byte.Alix Axel from comments saying that Google suggestion to store it in FLOAT(10,6) is really extra, because you don't need 4 digits for main part (since sign is separated and latitude is limited to 90 and longitude is limited to 180). You can easily use FLOAT(8,5) for 1/2m precision or FLOAT(9,6) for 50/2cm precision. Or you can even store lat and long in separated types, because FLOAT(7,5) is enough for lat. See MySQL float types reference. Any of them will be like normal FLOAT and equal to 4 bytes anyway.

Thông thường không gian không phải là một vấn đề ngày nay, nhưng nếu bạn muốn thực sự tối ưu hóa lưu trữ vì một lý do nào đó (từ chối trách nhiệm: Đừng tối ưu hóa trước), bạn có thể nén LAT (không quá 91 000 giá trị + dấu hiệu) Hơn 181 000 giá trị + dấu hiệu) đến 21 bit nhỏ hơn đáng kể so với 2xfloat (8 byte == 64 bit)

Đăng ký nhận bản tin của tôi và không bao giờ bỏ lỡ các bài viết sắp tới của tôi

Nhiều lần chúng tôi nắm bắt vị trí địa lý của người dùng và lưu trữ trong cơ sở dữ liệu cho các trường hợp sử dụng khác nhau. Tôi đã thấy rằng hầu hết các nhà phát triển sử dụng nhiều trường để lưu trữ vĩ độ và kinh độ riêng biệt như Table_name(field1, field2, ..., latitude, longitude).

Trong bài viết ngắn này, chúng ta sẽ thấy một cách thay thế để lưu trữ tọa độ trong cơ sở dữ liệu MySQL bằng cách sử dụng các loại dữ liệu không gian như POINT.

Tạo một bảng

  • Hãy để chúng tôi tạo một bảng có tên locations.
  • Trường coordinates của loại dữ liệu POINT.
CREATE TABLE locations (
      id INT(11) NOT NULL AUTO_INCREMENT,
      coordinates POINT,
      PRIMARY KEY (id)
);

Chèn tọa độ

  • Để chèn/cập nhật trường coordinates, chúng ta cần chuẩn bị một chuỗi như thế này 'POINT(latitude longitude)'.
  • Sau đó, chúng tôi sẽ sử dụng hàm được xây dựng được gọi là
    INSERT INTO 
         locations (coordinates) 
    VALUES 
         (ST_GeomFromText('POINT(21.67890 91.54789)');
    
    0 để tạo hình học trong SRID đã cho từ đặc tả WKT.
  • Chuyển chuỗi các điểm đã chuẩn bị vào hàm
    INSERT INTO 
         locations (coordinates) 
    VALUES 
         (ST_GeomFromText('POINT(21.67890 91.54789)');
    
    0.
INSERT INTO 
     locations (coordinates) 
VALUES 
     (ST_GeomFromText('POINT(21.67890 91.54789)');

Bảng sẽ lưu trữ và hiển thị dữ liệu theo cách sau

id        coordinates
1         POINT(21.67890 91.54789)

Ngoài ra, hãy kiểm tra điều này để biết cách bắt giữ vị trí địa lý của người dùng trong trình duyệt web.

Cảm ơn bạn đã đọc 🙏

Nếu bạn thích bài viết này hoặc thấy nó hữu ích, hãy cho nó một ngón tay cái 👍

Hãy kết nối 👋

Twitter | Instagram | LinkedIn

Bạn có thể lưu trữ các tệp trong MySQL không?

Đối tượng lớn nhị phân (Blob) là loại dữ liệu MySQL có thể lưu trữ dữ liệu nhị phân như hình ảnh, đa phương tiện và các tệp PDF..

Kiểu dữ liệu nào được sử dụng cho vị trí trong SQL?

Kiểu dữ liệu địa lý SQL SQL lưu trữ dữ liệu ellipsoidal (Trái đất), chẳng hạn như vĩ độ GPS và tọa độ kinh độ.ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.

Bạn có thể lưu trữ gì trong MySQL?

MySQL có thể hoạt động như một lưu trữ tài liệu NoQuery JSON để các lập trình viên có thể lưu dữ liệu mà không phải bình thường hóa dữ liệu, thiết lập các lược đồ hoặc thậm chí có manh mối dữ liệu của họ trông như thế nào trước khi bắt đầu mã.Kể từ khi MySQL phiên bản 5.7 và trong MySQL 8.0, các nhà phát triển có thể lưu trữ các tài liệu JSON trong một cột của bảng.NoSQL JSON Document Store so programmers can save data without having to normalize data, set up schemas, or even have a clue what their data looks like before starting to code. Since MySQL version 5.7 and in MySQL 8.0, developers can store JSON documents in a column of a table.

Loại dữ liệu nào nên là vĩ độ?

Đối với vĩ độ và kinh độ, bạn có thể sử dụng varchar hoặc gấp đôi.Lưu ý rằng dữ liệu vĩ độ và kinh độ của bạn phải ở dạng số dương và âm, và không ở dạng độ.VARCHAR or DOUBLE . Note that your latitude and longitude data must be in the form of positive and negative numbers, and not in the form of degrees.