La mayoría (de hecho, todos) de mis datos GIS tienen lo que llamo el requisito de valor de atributo "Mickey Mouse": Cada clase de entidad tiene un par de campos de atributo que contienen información aburrida como límites administrativos (en qué estado, condado ocurre este punto). En el pasado, he estado muy orgulloso de los dominios de atributos elaborados que he creado para que los editores de datos puedan elegir en qué (Condado, Estado, USGS Topo Quad) ocurre su punto de datos.<\/P>
<\/P>
Nadie los usa.<\/P>
La entrada de datos tiene un costo de tiempo y trabajo, y como la mayoría de nosotros, necesitamos enfocarnos en lo que es importante (lo que sucedió en este punto) y no tenemos mucho tiempo para la entrada administrativa de datos.<\/P>
Hasta que se debe entregar un informe que requiere la partición de valores de datos por (estado, condado o cuenca hidrográfica).<\/P>
En Usando SQL para Auto-Poblar Valores XY<\/A> describí el uso de un Trigger para automatizar la población de coordenadas GPS usando el texto bien conocido extraído de la columna geography. No hay razón por la que no podamos extender eso para manejar algunas tareas más de mantenimiento de datos.<\/P><\/P>En este ejemplo, tengo las siguientes clases de entidades poligonales de límites administrativos todas configuradas con el tipo de almacenamiento "Geography" y SRID 4629 en la misma base de datos SDE.<\/P>GRSM_COUNTIES: El nombre del condado se llena en el campo County;<\/LI>GRSM_States: El nombre del estado se llena en el campo State;<\/LI>GRSM_Sub_Ranger_Districts: El nombre del Distrito Ranger se llena en el campo PARKDISTRICT;<\/LI>USGS_24K_TOPOMAP_BOUNDARIES: El nombre del Cuadrante USGS se llena en el campo QuadName;<\/LI>WATERSHEDS: El nombre de la Cuenca HUC 12 se llena en el campo Watershed.<\/LI><\/LI><\/OL>Nuestra política de datos es que cada nuevo punto de datos será atribuido con el valor "Name" de cada uno de los 5 polígonos en los que ocurre. ¡Imaginen el entusiasmo de los editores de datos cuando se les dice que tienen que elegir uno entre muchos valores de una lista desplegable, 5 veces, por cada nuevo punto que agregan o editan!<\/P><\/P>Extendiendo Usando SQL para Auto-Poblar Valores XY<\/A>, podemos "unir" espacialmente el punto nuevo o actualizado con cada uno de los 5 polígonos en los que ocurre y obtener el valor requerido del polígono y escribirlo en el campo atributo correcto.<\/P><\/P>ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/****** activar en inserciones y actualizaciones ******\/\/****** deshabilitar trigger cuando la replicación o espejado SQL está habilitado ******\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/****** hipotéticamente podríamos ingresar latitud/longitud como texto y crear un objeto geography ******\/ SHAPE = CASE WHEN i.SHAPE IS NOT NULL THEN p.SHAPE ELSE Geography::STPointFromText('POINT(' + CAST(p.LON AS VARCHAR(20)) + ' ' + CAST(p.LAT AS VARCHAR(20)) + ')', 4269) END, \/****** caso usual: el punto es creado con ARC y convierte LAT/LON a texto ******\/\/****** desde el objeto geography ******\/ LON = CASE WHEN p.SHAPE IS NULL THEN p.LON ELSE p.SHAPE.Long END, LAT = CASE WHEN p.SHAPE IS NULL THEN p.LAT ELSE p.SHAPE.Lat END, QuadName = COALESCE(b.name, p.QuadName), Watershed = COALESCE(c.HUC_12_Name, p.Watershed), County = COALESCE(d.Name, p.County), State= COALESCE(e.Name, p.State), PARKDISTRICT = COALESCE(f.District, p.PARKDISTRICT) FROM TEST AS p \/****** permitir actualización de lat/lon al actualizar ******\/ INNER JOIN inserted AS i ON i.globalid = p.globalid LEFT OUTER JOIN USGS_24K_TOPOMAP_BOUNDARIES AS b ON b.Shape.STIntersects(i.Shape) = 1 LEFT OUTER JOIN WATERSHEDS AS c ON c.Shape.STIntersects(i.Shape) = 1 LEFT OUTER JOIN GRSM_COUNTIES AS d ON d.Shape.STIntersects(i.Shape) = 1 & nbsp ;& nbsp ;& nbsp ;& nbsp ;& nbsp ; LEFT OUTER JOIN GRSM_States AS e & nbsp ;& nbsp ;& nbsp ;& nbsp ; ON e.Shape.STIntersects(i.Shape) = 1 & nbsp ;& nbsp ;& nbsp ;& nbsp ; LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f ON f.Shape.STIntersects(i.Shape) = 1 & nbsp ; ; ENDGO<\/PRE><\/P>No hay límite en la cantidad de joins que puede usar para automatizar consultas espaciales que actualizan valores atributivos. Solo recuerde que ambas clases de entidades participantes en el join deben usar el mismo tipo de almacenamiento.<\/P><\/P>¿Pero qué pasa si quiere aplicar esto a datos existentes? Después de crear el trigger podría aplicar una consulta única para actualizar valores existentes. Este ejemplo usa el tipo de almacenamiento Geometry:<\/P><\/P><\/P>use GRSMupdate GRSM_TRAILSset CONG_DIST = CONGRESSIONALDISTRICTS.NAMELSADfrom GRSM_TRAILSinner join CONGRESSIONALDISTRICTSon grsm_trails.location_id = grsm_trails.location_idwhere (CONGRESSIONALDISTRICTS.Shape.STIntersection(grsm_trails.Shape).STDimension() = 1);<\/PRE><\/P><\/P>Este es un blog personal y no recomienda, respalda ni apoya los métodos descritos arriba. La alteración de datos usando SQL fuera del stack software ESRI, por supuesto, no está soportada y no debe aplicarse a una base de datos en producción sin un entendimiento completo y un plan de recuperación ante desastres.<\/EM><\/P><\/BODY><\/HTML>
En este ejemplo, tengo las siguientes clases de entidades poligonales de límites administrativos todas configuradas con el tipo de almacenamiento "Geography" y SRID 4629 en la misma base de datos SDE.<\/P>
Nuestra política de datos es que cada nuevo punto de datos será atribuido con el valor "Name" de cada uno de los 5 polígonos en los que ocurre. ¡Imaginen el entusiasmo de los editores de datos cuando se les dice que tienen que elegir uno entre muchos valores de una lista desplegable, 5 veces, por cada nuevo punto que agregan o editan!<\/P>
Extendiendo
ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/****** activar en inserciones y actualizaciones ******\/\/****** deshabilitar trigger cuando la replicación o espejado SQL está habilitado ******\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/****** hipotéticamente podríamos ingresar latitud/longitud como texto y crear un objeto geography ******\/ SHAPE = CASE WHEN i.SHAPE IS NOT NULL THEN p.SHAPE ELSE Geography::STPointFromText('POINT(' + CAST(p.LON AS VARCHAR(20)) + ' ' + CAST(p.LAT AS VARCHAR(20)) + ')', 4269) END, \/****** caso usual: el punto es creado con ARC y convierte LAT/LON a texto ******\/\/****** desde el objeto geography ******\/ LON = CASE WHEN p.SHAPE IS NULL THEN p.LON ELSE p.SHAPE.Long END, LAT = CASE WHEN p.SHAPE IS NULL THEN p.LAT ELSE p.SHAPE.Lat END, QuadName = COALESCE(b.name, p.QuadName), Watershed = COALESCE(c.HUC_12_Name, p.Watershed), County = COALESCE(d.Name, p.County), State= COALESCE(e.Name, p.State), PARKDISTRICT = COALESCE(f.District, p.PARKDISTRICT) FROM TEST AS p \/****** permitir actualización de lat/lon al actualizar ******\/ INNER JOIN inserted AS i ON i.globalid = p.globalid LEFT OUTER JOIN USGS_24K_TOPOMAP_BOUNDARIES AS b ON b.Shape.STIntersects(i.Shape) = 1 LEFT OUTER JOIN WATERSHEDS AS c ON c.Shape.STIntersects(i.Shape) = 1 LEFT OUTER JOIN GRSM_COUNTIES AS d ON d.Shape.STIntersects(i.Shape) = 1 & nbsp ;& nbsp ;& nbsp ;& nbsp ;& nbsp ; LEFT OUTER JOIN GRSM_States AS e & nbsp ;& nbsp ;& nbsp ;& nbsp ; ON e.Shape.STIntersects(i.Shape) = 1 & nbsp ;& nbsp ;& nbsp ;& nbsp ; LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f ON f.Shape.STIntersects(i.Shape) = 1 & nbsp ; ; ENDGO<\/PRE><\/P>No hay límite en la cantidad de joins que puede usar para automatizar consultas espaciales que actualizan valores atributivos. Solo recuerde que ambas clases de entidades participantes en el join deben usar el mismo tipo de almacenamiento.<\/P><\/P>¿Pero qué pasa si quiere aplicar esto a datos existentes? Después de crear el trigger podría aplicar una consulta única para actualizar valores existentes. Este ejemplo usa el tipo de almacenamiento Geometry:<\/P><\/P><\/P>use GRSMupdate GRSM_TRAILSset CONG_DIST = CONGRESSIONALDISTRICTS.NAMELSADfrom GRSM_TRAILSinner join CONGRESSIONALDISTRICTSon grsm_trails.location_id = grsm_trails.location_idwhere (CONGRESSIONALDISTRICTS.Shape.STIntersection(grsm_trails.Shape).STDimension() = 1);<\/PRE><\/P><\/P>Este es un blog personal y no recomienda, respalda ni apoya los métodos descritos arriba. La alteración de datos usando SQL fuera del stack software ESRI, por supuesto, no está soportada y no debe aplicarse a una base de datos en producción sin un entendimiento completo y un plan de recuperación ante desastres.<\/EM><\/P><\/BODY><\/HTML>
Los miembros registrados pueden publicar, seguir actualizaciones y más. ¿Nuevo aquí? Regístrate gratis.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.