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.
Comment puis-je utiliser la longitude et la latitude pour enregistrer un emplacement dans une colonne géographique?
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?
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;
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
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)