Validación de un punto (WGS84) dentro del campo de geometría en el servidor sql
Frecuentes
Visto 1,676 equipos
1
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
2 Respuestas
2
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
0
Podría usar, por ejemplo, los servicios REST de mapas de Bing para eso.
Para cada punto harías lo siguiente:
Consulta el servicio "Buscar una ubicación por punto" (http://msdn.microsoft.com/en-us/library/ff701710.aspx)
Utilice el campo "PostalCode" de la respuesta para validar su código postal.
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 sql sql-server spatial geography wgs84 or haz tu propia pregunta.
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? - Jon Bellamy
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. - culebrin
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? - Jon Bellamy
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... - culebrin
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? - Jon Bellamy