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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top