1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| CREATE FUNCTION get_distance_metres(@latitudeDepart FlOAT, @longitudeDepart FLOAT, @latitudeArrivee FLOAT, @longitudeArrivee FLOAT)
RETURNS FLOAT
AS
BEGIN
DECLARE @radLongitudeDepart FLOAT, @radLatitudeDepart FLOAT, @radLongitudeArrivee FLOAT, @radLatitudeArrivee FLOAT, @dlo FLOAT, @dla FLOAT, @a FLOAT
SET @radLongitudeDepart = RADIANS(@longitudeDepart)
SET @radLatitudeDepart = RADIANS(@latitudeDepart)
SET @radLongitudeArrivee = RADIANS(@longitudeArrivee)
SET @radLatitudeArrivee = RADIANS(@latitudeArrivee)
SET @dlo = (@radLongitudeArrivee - @radLongitudeDepart) / 2
SET @dla = (@radLatitudeArrivee - @radLatitudeDepart) / 2
SET @a = SIN(@dla) * SIN(@dla) + COS(@radLatitudeDepart) * COS(@radLatitudeArrivee) * SIN(@dlo) * SIN(@dlo)
RETURN (6378137 * 2 * ATN2(SQRT(@a), SQRT(1 - @a)))
END
GO
CREATE PROCEDURE SearchInZone
@id_region uniqueidentifier, @id_departement uniqueidentifier, @id_chef_lieu_departemental uniqueidentifier, @id_canton uniqueidentifier, @id_ville_depart uniqueidentifier, @rayon INT
AS
/* nous partons d'un point de départ, le centre de la zone de recherche */
DECLARE @latitude_depart FLOAT, @longitude_depart FLOAT
SELECT
@latitude_depart = latitude,
@longitude_depart = longitude
FROM
Ville
WHERE
id_ville = @id_ville_depart
/* variable de construction de la requete */
DECLARE @requete VARCHAR(1000), @req_GDM VARCHAR(100), @i INT
SET @req_GDM = 'dbo.get_distance_metres(' + CONVERT(VARCHAR, @latitude_depart) + ', ' + CONVERT(VARCHAR, @longitude_depart) + ', latitude, longitude)'
SET @requete = 'SELECT id_ville, nom_ville, arrondissement_ville, ROUND(' + @req_GDM + ' / 1000 , 2) AS distance
FROM Ville V '
SET @i = 0
/* construction de la requete */
IF @id_canton IS NOT NULL
BEGIN
SET @i = @i + 1
SET @requete = @requete + 'WHERE V.id_canton = ''' + CONVERT(CHAR(36), @id_canton) + ''''
END
ELSE
BEGIN
IF @id_chef_lieu_departemental IS NOT NULL
BEGIN
SET @i = @i + 1
SET @requete = @requete + 'WHERE V.id_chef_lieu_departemental = ''' + CONVERT(CHAR(36), @id_chef_lieu_departemental) + ''''
END
ELSE
BEGIN
IF @id_departement IS NOT NULL
BEGIN
SET @i = @i + 1
SET @requete = @requete + 'WHERE V.id_departement = ''' + CONVERT(CHAR(36), @id_departement) + ''''
END
ELSE
BEGIN
IF @id_region IS NOT NULL
BEGIN
SET @i = @i + 1
SET @requete = @requete + 'INNER JOIN Departement D ON V.id_departement = D.id_departement
WHERE D.id_region = ''' + CONVERT(CHAR(36), @id_region) + ''''
END
END
END
END
/* intégration du périmètre de recherche */
IF @i = 0
BEGIN
SET @requete = @requete + ' WHERE '
END
ELSE
BEGIN
SET @requete = @requete + ' AND '
END
SET @requete = @requete + @req_GDM + ' < ' + CONVERT(VARCHAR, @rayon)
/* order by */
SET @requete = @requete + ' ORDER BY distance ASC'
/* exécution de la reqiête */
EXEC(@requete)
GO |
Partager