Frage

Ich habe folgendes Problem bekommen: Ich habe eine Tabelle mit Long / lat Werte und eine andere Tabelle mit einem Projekt-ID und long / lat / Radius (Kreis).

Jetzt muß ich herausfinden, welches Projekt entspricht die lang / lat Werte aus der ersten Tabelle.

Gibt es eine einfache Möglichkeit, das zu tun?

War es hilfreich?

Lösung

Es gibt mehrere Algorithmen zu berechnen Abstand auf Kugel, aber wir verwenden folgende:

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

(wo 6378,137 - ist Erdradius)

So, jetzt, wenn Sie Abstand zwischen zwei Punkten auf der Erde berechnen können, können Sie Abfrage erstellen

 select * 
     from Table1, Project 
     where dbo.GetDistance(
           Table1.lat, Table1.lon, 
           Project.lat, Project.lon) < @YouRadius

Dabei gilt @YouRadius - parametrisierte Radius des Kreises

Andere Tipps

Relativ einfach: Berechnen der Großkreisentfernung zwischen dem Punkt und dem Mittelpunkt des Kreises. Ist der Abstand kleiner ist als der Radius ist, ist der Punkt, in dem Kreis, wenn nicht nicht. Wenn es auf dem Umfang des Kreises ist, entscheiden Sie. Es haben sich auf die Berechnung der Großkreisentfernungen mehrere SO Diskussionen, einen Blick auf sie.

Um die Dinge beschleunigen Sie könnten prüfen, mit der Definition jeden Kreis, sein minimalen Begrenzungsrahmen in lat / long ‚Quadrate‘ Speicher. Dies würde Sie mit den Informationen, die notwendig sind eine schnelle Überprüfung von zu tun, ob ein Punkt ist möglicherweise innerhalb eines Kreises, nur Entfernungen Berechnung, wenn der Punkt innerhalb der mbb.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top