Validación de un punto (WGS84) dentro del campo de geometría en el servidor sql

He estado tratando de validar si un punto WGS84 está dentro de un campo de geometría en SQL Server 2012.

El escenario es este, tengo la delimitación política de una zona geográfica en una base de datos SQL Server 2012 (código postal y todo), validada.

Luego, también tengo puntos en el sistema WGS84 que ubican alguna infraestructura con códigos postales enviados por proveedores, que quiero validar.

Necesito validar si cada punto (WGS84) pertenece al código postal enviado con él.

No tengo ni idea de por dónde empezar.

¡Gracias por la ayuda!.

Omar

preguntado el 19 de mayo de 14 a las 15:05

Omar, ¿puede proporcionar un poco más de información que me ayude a comprender mejor sus requisitos, por favor? Por ejemplo, no estoy del todo seguro de lo que quiere decir con validar códigos postales. ¿También puede proporcionar el país para el que necesita hacerlo? -

Gracias Jon, en otras palabras, tengo 2 tablas, primero, una con delimitación de ciudades en todo el país (Perú), estos datos provienen de exportar la forma ARCGIS y es una geometría y otro campo con el código postal correspondiente de esa delimitación. En segundo lugar, otra tabla con informes de proveedores con un punto georreferenciado (WGS84) en un campo y otro campo con un código postal en el que dicen estar. Detectamos que los datos de la segunda tabla no estaban bien formados, por lo que el código postal el código no correspondía al punto georreferenciado. Entonces, antes de que nos envíen datos, debemos validarlos. -

Entonces, los límites en la primera tabla, ¿son límites de ciudad o límites de código postal con una referencia de ciudad? -

En la primera tabla, los límites de los códigos postales coinciden con los límites de la ciudad (distrito)... los llamamos ciudades, pero son más como distritos para su referencia... Me disculpo por la confusión... -

OK, gracias, estoy empezando a entenderlo ahora. Entonces, la clave aquí es que desea poder decir "¿Está este punto (en la tabla 2) dentro de la geometría (en la tabla 1) que coincide con el código postal enviado con el punto (en la tabla 2)" - correcto? Si es así, una pregunta más, cuando dice que el campo de la tabla 1 es geometría, ¿es realmente geometría o formas geométricas dentro de un campo de Geografía? -

2 Respuestas

Para facilitarle la vida, primero deberá modificar la tabla 1 para incluir una columna de geografía, que contendrá los datos de geometría convertidos. Puedes convertir de la siguiente manera:

UPDATE [Table1] SET [NewGeographyColumn] = GEOGRAPHY::STGeomFromWKB([GeometryColumn].STAsBinary(), 4326);

Ahora que tiene una columna Geografía con un SRID coincidente con sus Puntos Table2, asegúrese de crear un SpatialIndex en esta nueva columna.

Luego puede ejecutar una consulta espacial para asegurarse de que los datos recibidos sean correctos:

DECLARE @receivedLatitude DOUBLE = 0;
DECLARE @receivedLongitude DOUBLE = 0;
DECLARE @receivedPostalCodeName VARCHAR(10) = 'Postcode';

DECLARE @receivedPoint GEOGRAPHY = GEOGRAPHY::Point(@receivedLatitude, @receivedLongitude, 4326);

SELECT * FROM [Table1] WHERE [NewGeographyColumn].STIntersects(@receivedPoint) AND [PostalCodeName] = @receivedPostalCodeName;

O al menos algo en ese sentido para validar....

Espero eso ayude.

contestado el 21 de mayo de 14 a las 17:05

Muchas gracias, pero por alguna razón, siempre muestra 0. Aquí está mi código de prueba: DECLARE @receivedLatitude FLOAT = 11.8147; -- DOUBLE DECLARE @receivedLongitude FLOAT = 74.7838; -- DOUBLE DECLARE @receivedPostalCodeName VARCHAR(10) = '120135'; DECLARE @receivedPoint GEOGRAPHY = GEOGRAPHY::Point(@receivedLatitude, @receivedLongitude, 4326); SELECT [NewGeographyColumn].STIntersects(@receivedPoint), * FROM [dbo].[CIUDADES] WHERE [CODIGO] = @receivedPostalCodeName; Lat y Long proporcionados pertenecen al código postal que se muestra, pero cuando cambio Lat a 13 (delimitación exterior), STIntersects sigue siendo 0 - culebrina

Ejecuté el código de actualización, lo probé y funcionó correctamente: culebrina

Me alegro de que haya ayudado. Sin embargo, solo quiero comprobar que al final lo hiciste funcionar. Me preocupa un poco que su latitud y longitud sean negativas para Perú (lo que podría explicar el resultado 0). ¿Estás obteniendo resultados correctos? - jon bellamy

Quise decir este código UPDATE [Table1] SET [NewGeographyColumn] = GEOGRAPHY::STGeomFromWKB([GeometryColumn].STAsBinary(), 4326);, pero tienes toda la razón, ¡la prueba con valores negativos funcionó perfectamente! Debería saber mejor con valores de latitud y longitud, esto me abre los ojos a un problema muy común con los datos informados (algunos valores se informaron en negativo, algunos valores en positivo, eso tengo que resolver de alguna manera) muchas gracias por su paciencia. Este problema me acompaña desde hace muchas semanas... - culebrina

Podría usar, por ejemplo, los servicios REST de mapas de Bing para eso.

Para cada punto harías lo siguiente:

Ejemplo (tomado de la página de referencia):

Solicitud:

http://dev.virtualearth.net/REST/v1/Locations/47.64054,-122.12934?key=BingMapsKey

(La BingMapsKey se puede obtener en www.bingmapsportal.com)

Respuesta, que incluye el Código Postal:

(...)
"address":{
   "addressLine":"1 Microsoft Way",
   "adminDistrict":"WA",
   "adminDistrict2":"King Co.",
   "countryRegion":"United States",
   "formattedAddress":"1 Microsoft Way, Redmond, WA 98052",
   "locality":"Redmond",
   "postalCode":"98052"
},
(...)

contestado el 20 de mayo de 14 a las 08:05

Muchas gracias por su respuesta, pero lamentablemente tengo 2 limitaciones importantes, primero, este desarrollo no es para Estados Unidos y, segundo, será para una estación de trabajo con o sin conexión a Internet. Esperaba usar solo una consulta SQL para resolver eso... - culebrina

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.