Většina (vlastně všechny) mých GIS dat má to, co nazývám požadavkem na "Mickey Mouse" hodnoty atributů: Každá třída prvků má několik atributových polí, která obsahují nudné informace, jako jsou administrativní hranice (ve kterém státě, okrese se tento bod nachází). V minulosti jsem byl velmi pyšný na propracované domény atributů, které jsem vytvořil, aby mohli editoři dat vybírat, v jakém (okrese, státě, USGS Topo Quad) se jejich datový bod nachází.<\/P>
<\/P>
Nikdo je nepoužívá.<\/P>
Zadávání dat má časové a pracovní náklady a jako většina z nás se musíme soustředit na to, co je důležité (co se stalo v tomto bodě) a nemáme moc času na administrativní zadávání dat.<\/P>
Až do chvíle, kdy je potřeba zpráva vyžadující rozdělení hodnot dat podle (státu, okresu nebo povodí).<\/P>
V Použití SQL k automatickému vyplnění hodnot XY<\/A> jsem popsal použití Triggeru k automatizaci vyplňování GPS souřadnic pomocí well-known textu získaného ze sloupce geography. Není důvod, proč bychom to nemohli rozšířit i na několik dalších úkolů údržby dat.<\/P><\/P>V tomto příkladu mám následující polygonové třídy prvků administrativních hranic všechny nakonfigurované s typem úložiště "Geography" a SRID 4629 ve stejné databázi SDE.<\/P>GRSM_COUNTIES: Název okresu je vyplněn v poli County;<\/LI>GRSM_States: Název státu je vyplněn v poli State;<\/LI>GRSM_Sub_Ranger_Districts: Název Ranger District je vyplněn v poli PARKDISTRICT;<\/LI>USGS_24K_TOPOMAP_BOUNDARIES: Název USGS Quad je vyplněn v poli QuadName;<\/LI>WATERSHEDS: Název povodí HUC 12 je vyplněn v poli Watershed.<\/LI><\/LI><\/OL>Naše datová politika je taková, že každý nový datový bod bude opatřen hodnotou "Name" každého z 5 polygonů, ve kterých se nachází. Představte si nadšení editorů dat, když jim řeknete, že musí pětkrát pro každý nový bod, který přidají nebo upraví, vybrat jednu z mnoha hodnot ze seznamu!<\/P><\/P>Rozšiřujíc Použití SQL k automatickému vyplnění hodnot XY<\/A> můžeme prostorově "připojit" nový nebo aktualizovaný bod ke každému z 5 polygonů, ve kterých se nachází, a získat požadovanou hodnotu z polygonu a zapsat ji do správného atributového pole.<\/P><\/P>ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/****** spustit při vložení a aktualizaci ******\/\/****** deaktivovat trigger při povolené SQL replikaci nebo zrcadlení ******\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/****** hypoteticky bychom mohli zadat latitudu/longitudu jako text a vytvořit objekt 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, \/****** obvyklý případ: bod je vytvořen ARC a převádí LAT/LON jako text ******\/\/****** z objektu 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 \/****** povolit aktualizaci lat/lon při aktualizaci ******\/ 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 LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f ON f.Shape.STIntersects(i.Shape) = 1 ; ENDGO<\/PRE><\/P>Neexistuje žádný limit počtu joinů, které můžete použít k automatizaci prostorových dotazů aktualizujících hodnoty atributů. Jen si pamatujte, že obě třídy prvků účastnící se joinu musí používat stejný typ úložiště.<\/P><\/P>A co když chcete toto aplikovat na existující data? Po vytvoření triggeru můžete provést jednorázový dotaz k aktualizaci existujících hodnot. Tento příklad používá typ úložiště Geometry:<\/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>Toto je osobní blog a nedoporučuje, nepodporuje ani nezastává výše popsané metody. Úprava dat pomocí SQL mimo software ESRI samozřejmě není podporována a neměla by být aplikována na produkční databázi bez důkladného porozumění a plánu obnovy po havárii.<\/EM><\/P><\/BODY><\/HTML>
V tomto příkladu mám následující polygonové třídy prvků administrativních hranic všechny nakonfigurované s typem úložiště "Geography" a SRID 4629 ve stejné databázi SDE.<\/P>
Naše datová politika je taková, že každý nový datový bod bude opatřen hodnotou "Name" každého z 5 polygonů, ve kterých se nachází. Představte si nadšení editorů dat, když jim řeknete, že musí pětkrát pro každý nový bod, který přidají nebo upraví, vybrat jednu z mnoha hodnot ze seznamu!<\/P>
Rozšiřujíc
ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/****** spustit při vložení a aktualizaci ******\/\/****** deaktivovat trigger při povolené SQL replikaci nebo zrcadlení ******\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/****** hypoteticky bychom mohli zadat latitudu/longitudu jako text a vytvořit objekt 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, \/****** obvyklý případ: bod je vytvořen ARC a převádí LAT/LON jako text ******\/\/****** z objektu 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 \/****** povolit aktualizaci lat/lon při aktualizaci ******\/ 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 LEFT OUTER JOIN GRSM_SUB_RANGER_DISTRICTS AS f ON f.Shape.STIntersects(i.Shape) = 1 ; ENDGO<\/PRE><\/P>Neexistuje žádný limit počtu joinů, které můžete použít k automatizaci prostorových dotazů aktualizujících hodnoty atributů. Jen si pamatujte, že obě třídy prvků účastnící se joinu musí používat stejný typ úložiště.<\/P><\/P>A co když chcete toto aplikovat na existující data? Po vytvoření triggeru můžete provést jednorázový dotaz k aktualizaci existujících hodnot. Tento příklad používá typ úložiště Geometry:<\/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>Toto je osobní blog a nedoporučuje, nepodporuje ani nezastává výše popsané metody. Úprava dat pomocí SQL mimo software ESRI samozřejmě není podporována a neměla by být aplikována na produkční databázi bez důkladného porozumění a plánu obnovy po havárii.<\/EM><\/P><\/BODY><\/HTML>
Přihlášení členové mohou přispívat, sledovat aktualizace a další. Nový zde? Zaregistrujte si bezplatný účet.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.