Salut,
Je souhaite calculer des distance entre villes et insérer le résultat dans une table. Seulement, je n'arrive pas à trouver une solution pour calculer la distance Marseille - Paris sans par la suite calculer la distance Paris - Marseille.
Voici de quoi illustrer mes propos.
Création des tables :Peuplement de la table VILLE_1:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 CREATE TABLE [dbo].[VILLE_1]( [LIB_VILLE] [nvarchar](255) NULL, [CODE_INSEE] [float] NOT NULL, [LATITUDE] [nvarchar](255) NULL, [LONGITUDE] [nvarchar](255) NULL ) ON [PRIMARY] ----------------------------------------------------- CREATE TABLE [dbo].[DISTANCE_1]( [ID_DISTANCE] [int] IDENTITY(1,1) NOT NULL, [POINT_A] [varchar](50) NULL, [POINT_B] [varchar](50) NULL, [VALEUR] [float] NULL, CONSTRAINT [PK_DISTANCE_1] PRIMARY KEY CLUSTERED ( [ID_DISTANCE] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]Requête d'insertion de la table DISTANCE_1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('La Roquette-sur-Siagne', 6108, '43.6', '6.95') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('La Roquette-sur-Var', 6109, '43.833333', '7.2') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Roubion', 6110, '44.083333', '7.05') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Roure', 6111, '44.083333', '7.083333') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Le Rouret', 6112, '43.683333', '7.016667') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Sainte-Agnès', 6113, '43.8', '7.466667') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-André', 6114, '43.733333', '7.283333') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Antonin', 6115, '43.916667', '6.983333') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Blaise', 6117, '43.833333', '7.233333') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Cézaire-sur-Siagne', 6118, '43.65', '6.8') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Dalmas-le-Selvage', 6119, '44.283333', '6.866667') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Étienne-de-Tinée', 6120, '44.258333', '6.925') INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Jean-Cap-Ferrat', 6121, '43.683333', '7.333333')Cette requête insère donc toutes les distances (Marseille - Paris et Paris - Marseille).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 insert into DISTANCE_1 select v1.LIB_VILLE as POINT_A, v2.LIB_VILLE as POINT_B, (6366 *acos( cos(radians(cast(isnull(v1.LATITUDE, '0') as float))) *cos(radians(cast(isnull(v2.LATITUDE, '0') as float))) *cos(radians(cast(isnull(v2.LONGITUDE, '0') as float)) -radians(cast(isnull(v1.LONGITUDE, '0') as float)) ) +sin(radians(cast(isnull(v1.LATITUDE, '0') as float))) *sin(radians(cast(isnull(v2.LATITUDE, '0') as float))) ) ) as VALEUR from VILLE_1 v1 inner join VILLE_1 v2 on v1.LIB_VILLE <> v2.LIB_VILLE where isnull(v1.LATITUDE, '') <> '' and isnull(v1.LONGITUDE, '') <> '' and isnull(v2.LATITUDE, '') <> '' and isnull(v2.LONGITUDE, '') <> '' and abs(abs(cast(isnull(v1.LATITUDE, '0') as float)) - abs(cast(isnull(v2.LATITUDE, '0') as float))) < 1 and abs(abs(cast(isnull(v1.LONGITUDE, '0') as float)) - abs(cast(isnull(v2.LONGITUDE, '0') as float))) < 1 order by v1.LIB_VILLE, v2.LIB_VILLE
Voyez-vous comment faire le plus simplement possible?
Merci par avance.
Partager