Distancia entre dois pontos pela latitude e longitude (MySQL < 8.0.14 ou => 8.0.14)
MySQL < 8.0.14
Esse código pode ser usado para varias finalidades, entre elas é saber a distancia de uma pessoa a outra ou de um imóvel a outro, porém ele tem algumas particularidades, ele não considera uma rota e sim em linha reta até o destino final.
No caso da imagem abaixo funcionaria bem:
Porém no caso abaixo, ele faz a linha em vermelho e não a rota da rua em questão:
Então vamos aos código, primeiro vamos criar os DDL.
DROP TABLE IF EXISTS `locais`;
CREATE TABLE `locais` (
`id` int NOT NULL AUTO_INCREMENT,
`origem_latitude` decimal(10,8) NOT NULL,
`origem_longitude` decimal(11,8) NOT NULL,
`destino_latitude` decimal(10,8) NOT NULL,
`destino_longitude` decimal(11,8) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `locais` (`id`, `origem_latitude`, `origem_longitude`, `destino_latitude`, `destino_longitude`) VALUES
(1, -25.533562989190866, -49.20987354394956, -25.534487277581988, -49.207705003382),
(2, -25.533569544452764, -49.20986627915704, -25.533798978393396, -49.20909257875354);
DELIMITER ;;
DROP FUNCTION IF EXISTS `sp_coordenada`;;
CREATE FUNCTION `sp_coordenada`(`origem_latitude` decimal(10,8), `origem_longitude` decimal(11,8), `destino_latitude` decimal(10,8), `destino_longitude` decimal(11,8)) RETURNS varchar(40) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
DETERMINISTIC
BEGIN
SET @distancia = (6372*acos(CAST(cos(radians(origem_latitude))*cos(radians(destino_latitude))*cos(radians(destino_longitude)-radians(origem_longitude))+sin(radians(origem_latitude))*sin(radians(destino_latitude)) AS decimal(16,15))));
RETURN @distancia;
END;;
DELIMITER;
SELECT sp_coordenada(origem_latitude,origem_longitude,destino_latitude,destino_longitude) as distancia FROM locais
No código acima criamos um select para buscar a função criada, podemos aplicar em uma view ou em busca em tempo real.
MySQL => 8.0.14
Para versão maior que 8.0.14, já é muito simples já tem uma função para fazer esse comparativo, basta executar o código abaixo.
SELECT ST_Distance(ST_GeomFromText('POINT(-25.533562989190866 -49.20987354394956)'), ST_GeomFromText('POINT(-25.534487277581988 -49.207705003382)')) as distancia;
Ler mais sobre: https://dev.mysql.com/doc/refman/8.0/en/spatial-relation-functions-object-shapes.html