2013-05-07 31 views
6

Ho circa 40.000 poligoni memorizzati come geometria nella mia tabella. Ora voglio creare un indice spaziale su quella colonna geometrica. Durante la creazione di Index spaziale, mi chiedono i valori della casella Bounding. Potete per favore aiutarmi su come trovare il mio limite. per ottenere la mia scatola di delimitazione ho bisogno di trovare il mio xmin, ymin, xmax, ymax.Scatola di contenimento per poligono

Grazie

+1

iterare su tutti i vertici, tenendo traccia del più a sinistra, più lontano a destra, più lontano e più lontano verso il basso xs e ys come si fa. (O fallo quando crei prima, se è troppo lento) – Patashu

risposta

7

EDIT: Si potrebbe utilizzare EnvelopeAggregate al posto del UnionAggregate e STEnvelope naturalmente ...


È possibile eseguire una UnionAggregate su tutti i poligoni, porre STEnvelope intorno a loro e selezionare visivamente i valori XMin, YMin, XMax, YMax. Ovviamente è possibile eseguire alcune manipolazioni TSQL dello STAsText del riquadro di delimitazione, ma lo lascerò come esercizio manuale.

Fornisce una casella che copre i poligoni esistenti, ma è necessario considerare la quantità di padding necessaria o i limiti necessari per i dati futuri.

Esempio:

use tempdb; 
create table GeometryTest(id int identity primary key, geom Geometry); 
insert GeometryTest values ('POLYGON((-130 54, -130 23, -60 23, -60 54, -130 54))'); 
insert GeometryTest values ('POLYGON((1 0, 0 0, 0 1, 1 1, 3 5, 1 0))'); 
insert GeometryTest values ('POLYGON((0 0, -100 5, 0 60, 70 70, 3 5, 0 0))'); 

select geometry::UnionAggregate (geom).STEnvelope().STAsText() 
from GeometryTest; 

--------------------------------------------------------------- 
POLYGON ((-130 0, 70 0, 70 70, -130 70, -130 0)) 
--------------------------------------------------------------- 

create spatial index six_GeometryTest_geom on GeometryTest(geom) 
    WITH (BOUNDING_BOX = (-130, 0, 70, 70)); 
+0

Genius! Grazie per quello. Sono di Wellington –

+0

Esiste un modo per farlo in SQL Server 2008? UnionAggregate e EnvelopeAggregate non esistono ancora lì. – Philipp

+0

@Philipp Questo *** è *** SQL server 2008. Forse intendi il 2005 o il 2008 con un'altra modalità di compatibilità? – RichardTheKiwi