GIS Fundstelle (langer Lats), die von einem Polygon enthalten sind, ausgedrückt als eine Sammlung von langen Lats

StackOverflow https://stackoverflow.com/questions/788469

  •  16-09-2019
  •  | 
  •  

Frage

Ich versuche, alle Datenelemente zu finden, die lange / Lats haben, die von einem Polygon besteht aus einer Reihe von langen Lats enthalten sind, könnten viele Punkte sein. Ich weiß, Sie können mit den neuen geospacial Datentypen in SQL 2008 diese Art von Sachen zu tun, aber ich bin mit SQL 2005 und C #. Wäre dies am besten im DB-Ende erfolgen auf oder in C #.

Danke.

War es hilfreich?

Lösung

Ich habe einige Codes für SQL2000 geschrieben, dies zu tun. Es verwendet die ‚Winkel‘ Verfahren zur Bestimmung, ob ein Punkt innerhalb eines Polygons liegt.

Zuerst wird die GetAngle benutzerdefinierte Funktion:

ALTER Function [dbo].[GetAngle](
@Ax Decimal(8,5), 
@Ay Decimal(8,5), 
@Bx Decimal(8,5), 
@By Decimal(8,5), 
@Cx Decimal(8,5), 
@Cy Decimal(8,5))

Returns Float Wie Begin

Declare @dot_product Float
Declare @cross_product Float

Declare @BAx Decimal(8,5)
Declare @BAy Decimal(8,5)
Declare @BCx Decimal(8,5)
Declare @BCy Decimal(8,5)

--' Get the vectors' coordinates.
Set @BAx = Sign(@Ax - @Bx) * dbo.CalculateDistance(@Ax, @Ay, @Bx, @Ay)
Set @BAy = Sign(@Ay - @By) * dbo.CalculateDistance(@Ax, @Ay, @Ax, @By)
Set @BCx = Sign(@Cx - @Bx) * dbo.CalculateDistance(@Cx, @Cy, @Bx, @Cy)
Set @BCy = Sign(@Cy - @By) * dbo.CalculateDistance(@Cx, @Cy, @Cx, @By)

--' Calculate the dot product.
Set @dot_product = @BAx * @BCx + @BAy * @BCy

--' Calculate the Z coordinate of the cross product.
Set @cross_product = @BAx * @BCy - @BAy * @BCx

--' Calculate the angle.
return ATn2(@cross_product, @dot_product)

Ende


Als nächstes nehme ich an gibt es eine Tabelle von variablen Breite / Länge-Paare und eine Sequenznummer (das die Reihenfolge, in der die Breiten- / Längenpaaren das Polygon definieren). Es ist wichtig, dass der erste Punkt in dieser Tabelle in der Tabelle der gleiche wie der letzte Punkt ist.

Auch ich habe mehrere Variablen für Min- und Max-Breite und Länge. Dies erzeugt effektiv einen Begrenzungsrahmen, so dass ich schnell Punkte nicht innerhalb eines rechteckigen Bereichs begrenzt das Polygon eliminieren kann.

Select  Address.AddressId
From    @Temp As A
        Inner Join @Temp As B
            On A.SequenceNumber = B.SequenceNumber - 1
        Inner Join Address
            On Address.XCoord Between @MinLongitude And @MaxLongitude
            And Address.YCoord Between @MinLatitude And @MaxLatitude
Group By Address.AddressId
Having Abs(Sum(dbo.GetAngle(A.Longitude, A.Latitude, Address.XCoord, Address.YCoord, B.Longitude, B.Latitude))) > 3.14

Andere Tipps

Es klingt wie etwas, das Kopfschmerz in T-SQL, wenn getan gibt (was mehr oder weniger alles, was ist wenn?). Natürlich hängt es von der Komplexität der Polygone und die Art und Weise der Datenelemente sind, aber im Allgemeinen kann die einfachste und ein mäßig effizienter Ansatz sein, einige anfänglichen Berechnungen in C # zu tun, die die Datenelemente in eine sehr groben Art und Weise begrenzt. So etwas wie folgt aus.

  1. Berechnen Sie die groben Grenzen des Polygons in C #.
  2. alles innerhalb dieser Grenzen von dem SQL Server.
  3. Sie die endgültige genaue Filterung in C #.

Die Leistung hängt natürlich davon ab, wie gut Sie die anfänglichen Grenzen berechnen können. Ich würde mit nur einem einfachen Begrenzungsrechteck zum ersten Mal starten und sehen, ob die Leistung ausreichend ist.

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