2013-05-07 8 views
6

Ich habe rund 40.000 Polygone als Geometrie in meiner Tabelle gespeichert. Jetzt möchte ich einen räumlichen Index für diese Geometriespalte erstellen. Beim Erstellen eines räumlichen Index wird nach Bounding Box-Werten gefragt. Kannst du mir bitte helfen, meine Grenze zu finden? Um meine Bounding Box zu bekommen, muss ich meine xmin, ymin, xmax, ymax finden.Begrenzungsrahmen für Polygon

Dank

+1

Iterate über alle Scheitel, der am weitesten links, am weitesten rechts, am weitesten oben und am weitesten nach unten xs und ys zu verfolgen wie Sie. (Oder tue es beim ersten Erstellen, wenn es zu langsam ist) – Patashu

Antwort

7

EDIT: Sie EnvelopeAggregate anstelle des UnionAggregate und STEnvelope natürlich ...


Sie führen eine UnionAggregate auf alle Polygone verwenden könnte, ein STEnvelope um sie herum gelegt und Wählen Sie visuell die XMin, YMin, XMax, YMax Werte aus. Natürlich können Sie eine TSQL-Manipulation der STAsText der Bounding Box machen, aber ich werde das als eine manuelle Übung verlassen.

Das gibt Ihnen eine Box, die Ihre vorhandenen Polygone abdeckt, aber Sie sollten überlegen, wie viel Padding Sie benötigen oder welche Grenzen für zukünftige Daten erforderlich sind.

Probe:

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! Dank dafür. Ich komme aus Wellington –

+0

Gibt es eine Möglichkeit, dies in SQL Server 2008 zu tun? UnionAggregate und EnvelopeAggregate existieren dort noch nicht .. – Philipp

+0

@Philipp *** *** *** SQL Server 2008. Vielleicht meinst du 2005 oder 2008 mit einem anderen Kompatibilitätsmodus? – RichardTheKiwi