web-dev-qa-db-fra.com

Comment stocker la longitude et la latitude comme une géographie dans le serveur SQL 2014?

Je suis un débutant SQL qui sait comment localiser les utilisateurs en coordonnées de longitude et de latitude. Mon objectif est finalement de pouvoir sélectionner toutes les lignes de myTable où la distance est inférieure à 2 km. Cependant, lorsque je me dirige vers cet objectif, certaines choses me déroutent et je vais donc essayer d’énumérer ce que je ne comprends pas.

  1. Comment puis-je utiliser la longitude et la latitude pour enregistrer un emplacement dans une colonne géographique?

  2. Maintenant que j'ai les points géographiques, comment puis-je sélectionner toutes les lignes d'une distance spécifique (dans mon cas, 2 km)? 

J'ai déjà vu des questions similaires, mais la quantité de compréhension préalable pour les résoudre dépasse mes connaissances en SQL puisque je suis un débutant absolu. Cela peut-il être fait facilement, tout le monde sait comment?

13
mattias

Comment puis-je utiliser les noms longitute et latitute pour enregistrer un emplacement dans une colonne géographique?

Vous pouvez utiliser geography::STPointFromText / geography::Point pour enregistrer la longitude et la latitude dans un type de données geography.

SELECT geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)

ou

SELECT geography::Point(Latitude, Longitude , 4326)

Lien de référence:

Mise à jour de la colonne Geography dans le tableau

Maintenant que j'ai les points géographiques, comment puis-je sélectionner toutes les lignes d'une distance spécifique (dans mon cas, 2 km)?

Vous pouvez utiliser STDistance comme ceci.

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('POINT(-122.35900 47.65129)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34720 47.65100)', 4326);
SELECT @g.STDistance(@h);

Lien de référence:

Distance entre deux points utilisant le type de données Geography dans sqlserver 2008?

Insérer une requête

DECLARE @GeoTable TABLE 
(
    id int identity(1,1),
    location geography
)
--Using geography::STGeomFromText
INSERT INTO @GeoTable 
SELECT geography::STGeomFromText('POINT(-122.35900 47.65129)', 4326)

--Using geography::Point
INSERT INTO @GeoTable 
SELECT geography::Point(47.65100,-122.34720, 4326);

Obtenir une requête de distance

DECLARE @DistanceFromPoint geography
SET @DistanceFromPoint =  geography::STGeomFromText('POINT(-122.34150 47.65234)', 4326);

SELECT id,location.Lat Lat,location.Long Long,location.STDistance(@DistanceFromPoint) Distance
FROM @GeoTable;
12
ughai

Ajout à la réponse ci-dessus @ughai

Ajout d'une colonne

 ALTER TABLE [dbo].[Landmark]
 ADD [GeoLocation] GEOGRAPHY
 GO

Convertir la longitude et les latitudes en géographie

UPDATE [dbo].[Landmark]
SET [GeoLocation] = geography::STPointFromText('POINT(' + CAST([Longitude] 
AS VARCHAR(20)) + ' ' + 
                CAST([Latitude] AS VARCHAR(20)) + ')', 4326)
GO

Trouver des lieux dans un rayon de 2 km

DECLARE @Origin GEOGRAPHY,
    -- distance defined in meters
    @Distance INTEGER = 2000;        


 SET @Origin = GEOGRAPHY::STGeomFromText('POINT(17.482477 78.546871)', 4326);

 -- return all rows from events in 2km radius
SELECT *,GeoLocation.STDistance(@Origin) Distance FROM dbo.Locations WHERE @Origin.STDistance(GeoLocation) <= @Distance;

cela a fonctionné pour moi pour obtenir les endroits dans la distance

0
Tajkumar

Vous pouvez convertir lat et long en un point et l'enregistrer dans le tableau.

Déclarez @geo Geography, @ Lat varchar (10), @ Long varchar (10)

SET @Lat = '34 .738925 ' SET @Long =' -92.39764 '

SET @ geo = geography :: Point (@LAT, @LONG, 4326)

0
Deepak Singla