2017-06-01 2 views
1

Bisher habe ich meine Ergebnisse gefiltert, um zu sehen, ob sie in eine gepufferte Linienfolge fallen. Jetzt möchte ich die Länge des Liniensegments entlang der Linienfolge vom Anfang der Route zu jedem Breiten- und Längengrad in den Spalten 3 und 4 berechnen.Länge der Route entlang der vordefinierten Linienfolge vom Anfang der Linienfolge bis zu Punkten innerhalb einer gepufferten Region um diese Linienfolge berechnen

Die Entfernung, die ich möchte, ist auf dem Foto unten abgebildet :

Distance explanation

declare @TripRecordsReportWaypoints table(Column1 int, column3 decimal(25,10), Column4 decimal(25,10), InRouteBuffer bit); 
insert into @TripRecordsReportWaypoints values (210,40.1445,-82.9911,1),(211,40.1444,-82.991 ,1),(212,40.1442,-82.9909,1),(213,40.1441,-82.9907,1),(214,40.144 ,-82.9906,1); 

declare @Columbus106from71to23 geography; 
set @Columbus106from71to23 = Geography ::STLineFromText('LINESTRING(-82.969404 40.142222,-82.972580 40.141951,-82.976319 40.141602, -82.979534 40.141376,-82.981217 40.141339,-82.983593 40.141409)',4326); 

declare @Routebuffer geography; 
set @Routebuffer = @Columbus106from71to23.STBuffer('20'); 

select Column1 
     ,Column3 
     ,Column4 
     ,@Routebuffer.STContains(geography::Point(Column3,Column4,4326)) as InRouteBuffer 
from @TripRecordsReportWaypoints 
where @Routebuffer.STContains(geography::Point(Column3,Column4,4326)) = 1; 

Was muss ich den Abstand des Liniensegments von Beginn meiner definierten Linienzug zu jedem Lat, tun müssen, lange zu berechnen. Ich hätte gerne eine Spalte, die DistanceAlongRoute ist.

Antwort

0

Ich bin nicht ganz sicher, was mit ihr gehe sowohl Ihre Daten und Ihre Anforderungen, da die Daten in Ihrer Frage nicht wirklich Sinn machen, aber ....

Um den Abstand zwischen zwei Punkten geography zu finden Sie können die GeogPoint.STDistance(OtherGeogPoint) Funktion verwenden, die die Entfernung in Metern zurückgibt.

Um den Beginn eines geographylinestring finden Sie entweder GeogLineString.STStartPoint() oder GeogLineString.STPointN(PointNumberYouWantToReturn) mit der Nummer 1, die funktionell gleichwertig sind verwenden, obwohl STPointN Sie tut geben ein wenig mehr Flexibilität sollten Sie Ihre Punkte später ändern möchten.

zusammen, das wie folgt aussehen:

select Column1 
     ,Column3 
     ,Column4 
     ,geography::Point(Column3,Column4,4326).STDistance(@Routebuffer.STPointN(1)) as StartPointToPointMetres 
from @TripRecordsReportWaypoints; 

von Ihren Kommentaren unten folgend, hier ist eine weitere Funktion, die Sie bekommen können helfen, wo Sie gehen müssen:

.ShortestLineTo() wird die kürzeste Linie zwischen einem geography Typ und einem anderen finden, der in Ihrem Fall so aussieht:

@Columbus106from71to23.ShortestLineTo(geography::Point(Column3,Column4,4326)).STStartPoint() as LineFromRouteToPoint 
+0

Dave, ich würde gerne wissen, wie weit ein bestimmter Punkt entlang der Route ist. Gibt es eine einfache Möglichkeit, dies zu berechnen? Ich möchte keine direkte Linienentfernung, ich möchte den Abstand vom Anfang der Linienfolge entlang der Linie bis zum Punkt in meinem Datensatz. Macht das mehr Sinn? – Jon

+0

In diesem Fall möchten Sie möglicherweise die Daten/Abfrage in Ihrer Frage anpassen, da keiner der Punkte in Ihren Daten tatsächlich von Ihrer Frage im Puffer ist. Zweitens, was meinst du mit * wie weit entlang der Route *? Wenn sich der Punkt innerhalb des Puffers befindet, möchten Sie entlang der "Linienfolge" bis direkt nördlich oder südlich des Punkts und dann in gerader Linie dorthin fahren oder den kürzesten Weg vom nächsten Teil der Linie nehmen? – iamdave

+0

Wenn sich der Punkt innerhalb des Puffers befindet, möchte ich entlang der Linienfolge fahren, bis er an dem Punkt mit der kürzesten Route vom nächsten Teil der Linie ist. Also der Abstand vom Anfang der Zeile bis zum nächsten Punkt der Zeile bis zum Punkt, der in Spalte 3 und 4 angegeben ist. – Jon

Verwandte Themen