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:

Caso queira pegar a latitude e longitude do mapa basta clicar com o botão direito do mouse em cima do local exato no qual será a primeira opçã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

Você pode gostar...