Pregunta

Tenemos una aplicación que tiene una base de datos llena de polígonos (actualmente almacenados como puntos) que una aplicación .NET se retira y verifica si se superponen.

Me ocurrí a mí que sería mucho más agradable convertir estas matrices de puntos a objetos de poligón / polilínea dentro de la base de datos y usar SQL para obtener un bool de clima que se superponen o no.

He visto diferentes métodos sugeridos para hacer esto, pero los ejemplos dados estaban bastante en línea con mis necesidades.

Estaría muy feliz de recibir información de esos amables para ofrecer su experiencia.

Adicional:

En respuesta a las preguntas: de hecho es 2D. Y sí, cualquier cruce de los dos se considera cierto. Los polígonos tienen N puntos y pueden ser cóncavos. Los polígonos se guardarán como 1 por fila (después de la tarea de conversión de datos) como polígonos (es decir, el tipo de polígono ... podría llamarse algo más espacial / geom, mi memoria no está de mi lado en este momento)

¿Fue útil?

Solución

Puede usar .stintersection con .stastext () para probar polígonos superpuestos. (Realmente odio la terminología que Microsoft ha utilizado (o quien establezca los términos estándar). "Touching", en mi mente, debería ser una prueba de si dos formas de geometría/geografía se superponen en absoluto, no solo compartir un borde).

De todos modos....

Si @Radiusgeom es una geometría que representa un radio desde un punto, lo siguiente devolverá una lista de dos polígonos donde una intersección (una geometría que representa el área donde dos geometrías se superponen) no está vacía.

SELECT CT.ID AS CTID, CT.[Geom] AS CensusTractGeom
FROM CensusTracts CT
WHERE CT.[Geom].STIntersection(@RadiusGeom).STAsText() <> 'GEOMETRYCOLLECTION EMPTY'

Si su campo de geometría está indexado espacialmente, esto se ejecuta bastante rápido. Ejecuté esto en 66,000 registros de CT de EE. UU. En aproximadamente 3 segundos. Puede haber una mejor manera, pero como nadie más tenía una respuesta, este fue mi intento de una respuesta para usted. ¡Espero eso ayude!

Otros consejos

Calcule y almacene el rectángulo delimitador de cada polígono en un conjunto de campos nuevos dentro de la fila que está asociada con ese polígono. (Supongo que tiene uno; si no, cree uno). Cuando su aplicación Dotnet tiene un polígono y está buscando polígonos superpuestos, puede obtener de la base de datos solo aquellos polígonos cuyos rectángulos delimitadores se superponen, utilizando una declaración SQL Select relativamente simple. Esos polígonos deben ser relativamente pocos, por lo que esto será eficiente. Luego, su aplicación Dotnet puede realizar los cálculos de superposición de polígono más finos para determinar cuáles se superponen realmente.

De acuerdo, tengo otra idea, así que la estoy publicando como una respuesta diferente. Creo que mi respuesta anterior con los polígonos delimitadores probablemente tenga algún mérito por sí solo, incluso si fuera para reducir la cantidad de polígonos obtenidos de la base de datos por un pequeño porcentaje, pero este probablemente sea mejor.

MSSQL admite la integración con el CLR desde la versión 2005. Esto significa que puede definir su propio tipo de datos en un ensamblaje, registre el ensamblaje con MSSQL, y desde ese momento en MSSQL aceptará su tipo de datos definido por el usuario como un tipo válido para una columna, e invocará su ensamblaje para realizar operaciones con su tipo de datos definidos por el usuario.

Un artículo de ejemplo para esta técnica en el CodeProject: Creación de tipos de datos definidos por el usuario en SQL Server 2005

Nunca he usado este mecanismo, por lo que no conozco detalles al respecto, pero supongo que debería poder definir una nueva operación en su tipo de datos, o tal vez sobrecargar alguna operación existente como "menos que", para que Puede verificar si un polígono se cruza con otro. Es probable que esto acelere mucho las cosas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top