A maior parte (na verdade, toda) dos meus dados GIS tem o que eu chamo de requisito de valor de atributo "Mickey Mouse": Cada classe de feição tem alguns campos de atributo que contêm informações entediantes, como limites administrativos (em qual estado, condado este ponto ocorre). No passado, eu me orgulhava muito dos domínios de atributo elaborados que criei para que os editores de dados pudessem escolher em qual (Condado, Estado, USGS Topo Quad) seu ponto de dados ocorre.<\/P>
<\/P>
Ninguém os usa.<\/P>
A entrada de dados tem um custo de tempo e trabalho, e como a maioria de nós, precisamos focar no que é importante (o que aconteceu neste ponto) e não temos muito tempo para entrada administrativa de dados.<\/P>
Até que um relatório seja devido que exige a partição dos valores dos dados por (estado, condado ou bacia hidrográfica).<\/P>
Em Using SQL to Auto-Populate XY Values<\/A> descrevi o uso de um Trigger para automatizar a população das coordenadas GPS usando o well-known text extraído da coluna geography. Não há razão para não estendermos isso para lidar com algumas outras tarefas de manutenção de dados.<\/P><\/P>Neste exemplo, tenho as seguintes classes de feição poligonais de limites administrativos todas configuradas com o tipo de armazenamento "Geography" e SRID 4629 no mesmo banco de dados SDE.<\/P>GRSM_COUNTIES: O nome do condado é preenchido no campo County;<\/LI>GRSM_States: O nome do estado é preenchido no campo State;<\/LI>GRSM_Sub_Ranger_Districts: O nome do distrito florestal é preenchido no campo PARKDISTRICT;<\/LI>USGS_24K_TOPOMAP_BOUNDARIES: O nome do USGS Quad é preenchido no campo QuadName;<\/LI>WATERSHEDS: O nome da bacia hidrográfica HUC 12 é preenchido no campo Watershed.<\/LI><\/LI><\/OL>Nossa política de dados é que cada novo ponto de dado será atribuído com o valor "Name" de cada um dos 5 polígonos em que ele ocorre. Imagine o entusiasmo dos editores de dados quando lhes dizem que eles têm que escolher um entre muitos valores em uma lista suspensa, 5 vezes, para cada novo ponto que adicionam ou editam!<\/P><\/P>Estendendo Using SQL to Auto-Populate XY Values<\/A>, podemos "juntar" o ponto novo ou atualizado espacialmente com cada um dos 5 polígonos em que ele ocorre e pegar o valor necessário do polígono e escrevê-lo no campo de atributo correto.<\/P><\/P>ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/****** dispara em inserções e atualizações ******\/\/****** desabilita trigger quando replicação SQL ou espelhamento está habilitado ******\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/****** hipoteticamente poderíamos inserir lat\/lon como texto e criar um 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 ponto é criado com ARC e converte LAT\/LON como texto ******\/\/****** a partir do 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 \/****** permite atualização de lat\/lon na atualização ******\/ 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 LEFT OUTER JOIN GRSM_States AS e ON e.Shape.STIntersects(i.Shape) = 1 LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f ON f.Shape.STIntersects(i.Shape) = 1 ; ENDGO<\/PRE><\/P>Não há limite para o número de joins que você pode usar para automatizar consultas espaciais que atualizam valores de atributos. Apenas lembre-se que ambas as classes de feição participando do join precisam usar o mesmo tipo de armazenamento.<\/P><\/P>Mas e se você quiser aplicar isso a dados existentes? Após criar o trigger você poderia aplicar uma consulta única para atualizar valores existentes. Este exemplo está usando o tipo de armazenamento 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 é um blog pessoal e não recomenda, endossa ou apoia os métodos descritos acima. A alteração dos dados usando SQL fora da pilha de software ESRI, claro, não é suportada e não deve ser aplicada a um banco de dados em produção sem um entendimento completo e plano de recuperação contra desastres.<\/EM><\/P><\/BODY><\/HTML>
Neste exemplo, tenho as seguintes classes de feição poligonais de limites administrativos todas configuradas com o tipo de armazenamento "Geography" e SRID 4629 no mesmo banco de dados SDE.<\/P>
Nossa política de dados é que cada novo ponto de dado será atribuído com o valor "Name" de cada um dos 5 polígonos em que ele ocorre. Imagine o entusiasmo dos editores de dados quando lhes dizem que eles têm que escolher um entre muitos valores em uma lista suspensa, 5 vezes, para cada novo ponto que adicionam ou editam!<\/P>
Estendendo
ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/****** dispara em inserções e atualizações ******\/\/****** desabilita trigger quando replicação SQL ou espelhamento está habilitado ******\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/****** hipoteticamente poderíamos inserir lat\/lon como texto e criar um 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 ponto é criado com ARC e converte LAT\/LON como texto ******\/\/****** a partir do 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 \/****** permite atualização de lat\/lon na atualização ******\/ 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 LEFT OUTER JOIN GRSM_States AS e ON e.Shape.STIntersects(i.Shape) = 1 LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f ON f.Shape.STIntersects(i.Shape) = 1 ; ENDGO<\/PRE><\/P>Não há limite para o número de joins que você pode usar para automatizar consultas espaciais que atualizam valores de atributos. Apenas lembre-se que ambas as classes de feição participando do join precisam usar o mesmo tipo de armazenamento.<\/P><\/P>Mas e se você quiser aplicar isso a dados existentes? Após criar o trigger você poderia aplicar uma consulta única para atualizar valores existentes. Este exemplo está usando o tipo de armazenamento 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 é um blog pessoal e não recomenda, endossa ou apoia os métodos descritos acima. A alteração dos dados usando SQL fora da pilha de software ESRI, claro, não é suportada e não deve ser aplicada a um banco de dados em produção sem um entendimento completo e plano de recuperação contra desastres.<\/EM><\/P><\/BODY><\/HTML>
Membros conectados podem postar, seguir atualizações e mais. Novo aqui? Registre uma conta gratuita.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.