2017-06-01 5 views
1

Jusqu'à présent, j'ai filtré mes résultats pour voir s'ils se trouvaient dans une chaîne de lignes tamponnée. Maintenant, je voudrais calculer la longueur du segment de ligne, le long de la ligne, du début de la route à chaque latitude et longitude énumérées dans les colonnes 3 et 4.Calculer la longueur de la route le long de la chaîne de caractères prédéfinie depuis le début de la chaîne jusqu'à des points dans une région mise en mémoire tampon autour de cette chaîne de ligne

La distance que je veux est représentée sur la photo ci-dessous :

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; 

Que dois-je faire pour calculer la distance du segment de ligne depuis le début de mon défini linestring à chaque Lat, long. Je voudrais avoir une colonne qui est DistanceAlongRoute.

Répondre

0

Je ne suis pas tout à fait sûr ce qui se passe à la fois vos données et vos besoins que les données de votre question ne fait pas vraiment de sens, mais ....

Pour trouver la distance entre deux points de geography vous pouvez utiliser la fonction GeogPoint.STDistance(OtherGeogPoint), qui renverra la distance en mètres.

Pour trouver le début d'une geographylinestring vous pouvez utiliser GeogLineString.STStartPoint() ou GeogLineString.STPointN(PointNumberYouWantToReturn) avec le nombre 1, qui sont fonctionnellement équivalents, bien que STPointN ne vous donne un peu plus de flexibilité si vous voulez changer vos points plus tard.

Mis ensemble, ce regard comme ce qui suit:

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

Après de vos commentaires ci-dessous, voici une autre fonction qui peut vous aider à obtenir à l'endroit où vous devez aller:

.ShortestLineTo() trouvera la ligne la plus courte entre un type geography et un autre, qui dans votre cas ressemble à ceci:

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

Dave, j'aimerais savoir à quelle distance se trouve un point particulier. Y a-t-il un moyen simple de calculer cela? Je ne veux pas une distance de ligne de détroit, je veux la distance entre le début de la chaîne de ligne, le long de la ligne jusqu'au point dans mon ensemble de données. Est-ce que ça fait plus de sens. – Jon

+0

Dans ce cas, vous voudrez peut-être ajuster les données/requêtes dans votre question, car aucun des points de vos données n'est réellement dans le tampon de votre question. Deuxièmement, qu'entendez-vous par * à quelle distance de la route *? Si le point est à l'intérieur du tampon, voulez-vous voyager le long de la «ligne» jusqu'au nord ou au sud du point, puis suivre la ligne droite ou prendre l'itinéraire le plus court depuis la partie la plus proche de la ligne? – iamdave

+0

Si le point est dans la mémoire tampon, je veux parcourir la ligne jusqu'à ce qu'elle soit au point avec l'itinéraire le plus court de la partie la plus proche de la ligne. Donc, la distance entre le début de la chaîne de caractères tout le long de la ligne-chaîne jusqu'à ce qu'elle soit au point le plus proche sur la ligne-ligne jusqu'au point donné dans les colonnes 3 et 4. – Jon