Rasters, Pixels and Code Oh My!<\/A> eu estendi um gatilho de automação para preencher um campo de atributo com base em sua localização dentro de um pixel raster. Mas eu ainda quero mais automação de dados. Eu quero tudo!<\/P>
Não queremos apenas saber alguns atributos administrativos dos novos pontos de dados (em qual condado, estado ele está?: Interseção Espacial), quão alto ele está, mas em uma era de pontos de dados não tão precisos, o que está mais próximo deste ponto?<\/P>
<\/P>
Nesta aplicação específica, um conjunto de dados de monitoramento da qualidade da água, eu também quero saber o nome do riacho onde este ponto ocorre, assim como a ordem do riacho. Estou usando NHD Stream Lines que foram processados pelo Arc Hydro para adicionar a Ordem Strahler do Riacho como um atributo.<\/P>
<\/P>
Usando uma Consulta de Vizinho Mais Próximo eu posso realizar isso, embora com um pouco mais de complexidade porque agora estou pedindo ao SQL para procurar a feição "Nearest", e não uma simples interseção de dois objetos geográficos. O bloco de código começa na linha 48.<\/P>
<\/P>
<\/P>
<\/P>
ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]
ON [dbo].[TEST]
\/****** disparar em inserções e atualizações ******\/
\/****** desabilitar gatilho quando replicação ou espelhamento SQL estiver habilitado ******\/
after INSERT,UPDATE NOT FOR REPLICATION
AS
BEGIN
SET NOCOUNT ON;
UPDATE p SET
\/****** hipoteticamente poderíamos inserir a 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),
ELEVATION = (SELECT
pdata.getValueByLoc(1,p.SHAPE.Long,p.SHAPE.Lat) FROM [dbo].[DEM10MP]),
StreamName = COALESCE(g.GNIS_Name, p.StreamName),
RiverOrder = COALESCE(h.RiverOrder, p.RiverOrder)
FROM TEST
AS p
\/****** permitir 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
& nbsp; LEFT OUTER JOIN GRSM_States AS e
ON e.Shape.STIntersects(i.Shape) = 1
& nbsp; LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f
on f.Shape.STIntersects(i.Shape) = 1
\/****** Vizinho Mais Próximo ******\/
CROSS APPLY (SELECT TOP 1 GNIS_Name, shape& nbsp;
FROM dbo.NHDFLOWLINE
\/****** forçar dica de índice espacial ******\/
WITH(index ([S208_idx]))& nbsp;
WHERE NHDFLOWLINE.Shape.STDistance(i.Shape) IS NOT NULL
& nbsp; ORDER BY NHDFLOWLINE.Shape.STDistance(i.Shape) ASC) as g
CROSS APPLY (SELECT TOP 1 RiverOrder, shape& nbsp;
FROM dbo.NHDFLOWLINE
\/****** forçar dica de índice espacial ******\/
WITH(index ([S208_idx]))& nbsp;
WHERE NHDFLOWLINE.Shape.STDistance(i.Shape) IS NOT NULL
& nbsp; ORDER BY NHDFLOWLINE.Shape.STDistance(i.Shape) ASC) as h
& nbsp;;
END
GO<\/PRE><\/P>Note o uso de uma dica de índice aqui. No SQL 2008 o uso do índice espacial não é respeitado e, na verdade, não funciona sem muitos ajustes. Aqui estamos dizendo para encontrar o nome do riacho mais próximo e sua ordem, mas usar o índice espacial da classe de feição NHD Flowline para otimizar a consulta. Sem a dica do índice essa consulta demora uma eternidade!<\/P><\/P>Se o nome do riacho for nulo (como muitos são), as declarações crossapply e order by param a busca no riacho mais próximo em vez de procurar o riacho nomeado mais próximo.<\/P><\/P>Descobri que isso funciona melhor quando aplico algumas regras de entrada de dados: adicionar um novo ponto somente usando snapping (para a camada NHD na interface do mapa). Existe o perigo de alguém adicionar erroneamente um novo ponto que esteja "um pouco" entre dois riachos, e o nome e ordem errados podem ser atribuídos ao ponto.<\/P><\/P>Nesta aplicação específica, estamos usando isso em conjunto com as ferramentas USGS HEM, que lidam com o snapping, atribuição e preenchimento do reachcode para os dados do ponto, então não estamos muito preocupados com o cenário do ponto errado no lugar errado.<\/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 de produção sem um entendimento completo e plano de recuperação de desastres.<\/EM><\/P><\/BODY><\/HTML>