2016-05-12 6 views
2

Ich habe eine Tabelle mit 40 Polygonen, die den Namen, die ID und die Geometrie enthalten. Ich habe eine zweite Tabelle mit Adressen, deren eigene Geometrie als Punkte dargestellt wird. Ich habe die 40 Polygone mit geometry::UnionAggregate aggregiert.Polygon zurückgeben Name, der einen Punkt in SQL Server 2014 enthält

Ich möchte in der Lage sein, die ID des Polygons für einen Punkt insbesondere aus meiner Tabelle von Adressen zurückzugeben. Das Folgende ist mein Code, aber ich bekomme einen wahren Wert (1) für jedes der 40 Polygone. Ich erwartete 39 nulls und '1' für das Polygon, das den Punkt tatsächlich enthält. Liegt das daran, dass es jetzt die aggregierten Polygone als eine Einheit behandelt, also enthalten sie alle den Punkt?

Ich bin neu bei räumlichen Abfragen und mag etwas blendend offen, aber würde etwas Hilfe zu schätzen wissen.

declare @n geometry 
set @n = (select geometry::UnionAggregate(sp_geometry) from Polygons) 
declare @p geometry 
set @p = (select sp_geometry from PointData); 

select n.id from Polygons n, pointdata p 
where @n.MakeValid().STWithin(@p) = 1 

Antwort

1

Die UnionAggregate wird ein Polygon sein, dass die Vereinigung aller der Polygone in der Tabelle ist (@n.ToString() tun und es sich selbst beweisen). Daher haben Sie die Genauigkeit verloren, mit der Polygone sich mit Ihrem Punkt schneiden. Sie müssen die einzelnen Polygone testen. Ich würde es so machen:

select * 
from dbo.Polygons as poly 
join dbo.PointData as point 
    on poly.STIntersectects(point.sp_geometry) = 1; 
+0

Dank Ben Ihre Antwort zu schätzen, zurückgegeben genau das, was ich wollte! – SSingh