Punti GIS Trova (lunghe dorsali) che sono contenuti da un poligono espresso come una raccolta di lunghe lats

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

  •  16-09-2019
  •  | 
  •  

Domanda

Sto cercando di trovare tutti gli elementi di dati che hanno long / lats che sono contenuti da un poligono formato da una serie di lunghe dorsali potrebbe essere molti punti. So che si può fare questo tipo di cose con i nuovi tipi di dati geospacial in SQL 2008, ma sto usando SQL 2005 e C #. Sarebbe questo essere meglio fatto in alla fine DB o in C #.

Grazie.

È stato utile?

Soluzione

Ho qualche codice scritto per SQL2000 per fare questo. Esso utilizza il metodo 'angolo' per determinare se un punto all'interno di un poligono.

In primo luogo, la funzione utente GetAngle definita:

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

I ritorni Float Come 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)

Fine


Avanti presumo c'è una variabile tabella di coppie di latitudine / longitudine e un numero di sequenza (che indica l'ordine in cui il LAT / LONG coppie definiscono il poligono). E 'importante che il primo punto in questa tabella è la stessa come l'ultimo punto della tabella.

Inoltre, ho diverse variabili per Min e Max latitudine e longitudine. Questo crea effettivamente un rettangolo di selezione in modo che possa eliminare rapidamente i punti non all'interno di una regione rettangolare di delimitazione del poligono.

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

Altri suggerimenti

E 'suona come qualcosa che dà un mal di testa se fatto in T-SQL (che è più o meno tutto però?). Naturalmente dipende dalla complessità dei poligoni e il modo in cui gli elementi di dati si trovano, ma in generale l'approccio più semplice e moderatamente efficace potrebbe essere quella di fare alcuni calcoli iniziali in C # che limita gli elementi di dati in un modo molto approssimativo. Quindi qualcosa di simile alla seguente.

  1. Calcola i confini grezzi del poligono in C #.
  2. Ottenere tutto all'interno di questi confini dal server SQL.
  3. Fare la accurato filtraggio finale in C #.

Le prestazioni, ovviamente dipende da quanto bene si può calcolare i limiti iniziali. Mi piacerebbe iniziare con un semplice rettangolo di delimitazione prima e vedere se la prestazione è sufficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top