Point sur le cercle (Longitude / Latitude) dans .NET / SQL
-
20-09-2019 - |
Question
J'ai le problème suivant: J'ai une table avec des valeurs latitude / longitude et une autre table avec un projet-id et long / lat / rayon (cercle).
Maintenant, je dois savoir quel projet correspond aux valeurs latitude / longitude de la première table.
Y at-il un moyen facile de le faire?
La solution
Il y a plusieurs algorithmes pour calculer la distance sur la sphère, mais nous utilisons ce qui suit:
create function GetDistance(
@latitudeFrom decimal(30,10),
@longitudeFrom decimal(30,10),
@latitudeTo decimal(30,10),
@longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN
DECLARE @distance float
SET @distance = ROUND(6378.137 * ACOS(
convert(decimal(30,10),
(SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
(COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)
RETURN @distance
END
go
(où 6378,137 - est le rayon de la Terre)
Alors maintenant, quand vous pouvez calculer la distance entre 2 points sur la Terre, vous pouvez construire requête
select *
from Table1, Project
where dbo.GetDistance(
Table1.lat, Table1.lon,
Project.lat, Project.lon) < @YouRadius
où @YouRadius - rayon paramétrés de votre cercle
Autres conseils
Relativement facile: calculer la distance orthodromique entre le point et le centre du cercle. Si la distance est inférieure au rayon, le point est dans le cercle, sinon pas. Si elle est sur la circonférence du cercle, vous décidez. Il y a eu plusieurs discussions sur le calcul des SO distances du grand cercle, ont un regard sur eux.
Pour accélérer les choses que vous pourriez envisager de stocker, avec la définition de chaque cercle, sa zone de délimitation minimum dans « carrés » lat / long. Cela vous fournir les informations nécessaires pour faire une vérification rapide si un point est peut-être à l'intérieur d'un cercle, que des distances de calcul lorsque le point est à l'intérieur du MBB.