Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie MySQL o geolokalizacji

Problem polega na tym, że sposób przechowywania danych w bazie danych nie jest dostosowany do rodzaju wykonywanego zadania. Korzystanie z Point wartości w Geometry punkty danych to droga. Właściwie zakodowałem coś ponad 4 lata temu w tym celu, ale mam problemy ze znalezieniem tego. Ale ten post wydaje się to dobrze pokrywać.

EDYTUJ OK, znalazłem mój stary kod, ale odnosi się on do starych danych klienta, których oczywiście nie mogę udostępnić. Ale kluczem do przyspieszenia ze współrzędnymi w bazach danych jest użycie POINT dane przechowywane w tabeli bazy danych o typie GEOMETRY . Więcej szczegółów tutaj na oficjalnej stronie MySQL. Ponieważ potrzebowałem powodu, aby przez jakiś czas ponownie przyjrzeć się temu rodzajowi kodu – i koncepcji – oto szybki skrypt MySQL, który stworzyłem, aby utworzyć przykładową tabelę z przykładowymi danymi, aby przekazać podstawowe koncepcje. Gdy zrozumiesz, co się dzieje, otwiera się wiele fajnych opcji.

Znalazłem również to świetne/proste wyjaśnienie koncepcji.

I znalazłem kolejna świetna ocena danych przestrzennych w MySQL 5.6. Mnóstwo świetnych informacji na temat indeksów i wydajności. W szczególności w odniesieniu do wydajności indeksu przestrzennego MySQL:

A z drugiej strony:

A oto moje podstawowe skrypty testujące MySQL, które pomogą zilustrować tę koncepcję:

/* 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. Jak przechowywać tablice w MySQL?

  2. Przełącz bazę danych w puli połączeń w nodejs MySQL

  3. Jak korzystać z Hibernacji eqOrIsNull()

  4. Jak wyeksportować bazę danych MySQL do JSON?

  5. Czy można odwoływać się do jednej kolumny jako wielu kluczy obcych?