Points FIND SIG (longues lats) qui sont contenus par un polygone exprimé comme une collection de longues lats

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

  •  16-09-2019
  •  | 
  •  

Question

Je suis en train de trouver tous les éléments de données qui ont une longue / lats qui sont contenus par un polygone constitué d'un ensemble de longues lats pourrait être beaucoup de points. Je sais que vous pouvez faire ce genre de choses avec les nouveaux types de données géospatiale dans SQL 2008, mais j'utilise SQL 2005 et C #. Serait-ce mieux fait sur à la fin DB ou en C #.

Merci.

Était-ce utile?

La solution

J'ai un code écrit pour SQL2000 de le faire. Elle utilise la méthode « angle » pour déterminer si un point se trouve à l'intérieur d'un polygone.

En premier lieu, la fonction définie par l'utilisateur GetAngle:

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))

Retours Float Comme Début

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)

Fin


Ensuite, je suppose qu'il y a une variable de table de paires latitude / longitude et un numéro de séquence (en indiquant l'ordre dans lequel les paires latitude / longitude définissent le polygone). Il est important que le premier point dans ce tableau est le même que le dernier point de la table.

Aussi, j'ai plusieurs variables pour Min et Max Latitude et longitude. Cela crée effectivement un cadre de sélection afin que je puisse éliminer rapidement les points ne dans une zone rectangulaire délimitant le polygone.

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

Autres conseils

Il ressemble à quelque chose qui donne un mal de tête si elle est faite dans T-SQL (ce qui est plus ou moins tout ce que?). Bien sûr, cela dépend de la complexité des polygones et la façon dont les éléments de données se trouvent, mais en général le plus facile et une approche modérément efficace pourrait consister à faire des calculs initiaux en C # qui limite les éléments de données d'une manière très approximative. Donc, quelque chose comme ce qui suit.

  1. Calculer les limites approximatives du polygone en C #.
  2. Tout ce dont l'intérieur de ces limites à partir du serveur SQL.
  3. Faites le filtrage précis finale en C #.

La performance dépend bien sûr de la façon dont vous pouvez calculer les limites initiales. Je commencerais avec juste un simple rectangle englobant d'abord et voir si la performance est suffisante.

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