Het merendeel (eigenlijk al mijn) GIS-gegevens heeft wat ik noem de "Mickey Mouse" attribuutwaardevereiste: Elke feature class heeft een paar attribuutvelden die saaie informatie bevatten zoals administratieve grenzen (in welke staat, provincie dit punt zich bevindt). In het verleden was ik erg trots op de uitgebreide attribuutsdomeinen die ik had gemaakt zodat data-editors konden kiezen in welke (County, State, USGS Topo Quad) hun datapunt zich bevindt.<\/P>
<\/P>
Niemand gebruikt ze.<\/P>
Data-invoer kost tijd en arbeid, en net als de meesten van ons moeten we ons richten op wat belangrijk is (wat er op dit punt is gebeurd) en hebben we niet veel tijd voor administratieve data-invoer.<\/P>
Totdat er een rapport moet worden ingediend dat vereist dat datawaarden worden verdeeld per (staat, county of stroomgebied).<\/P>
In Using SQL to Auto-Populate XY Values<\/A> beschreef ik het gebruik van een Trigger om de populatie van GPS-coördinaten te automatiseren met behulp van de well-known text uit de geography-kolom. Er is geen reden waarom we dat niet kunnen uitbreiden naar het afhandelen van nog een paar dataonderhoudstaken.<\/P><\/P>In dit voorbeeld heb ik de volgende administratieve grens polygon feature classes, allemaal geconfigureerd met het "Geography" opslagtype en SRID 4629 in dezelfde SDE-database.<\/P>GRSM_COUNTIES: County naam wordt ingevuld in het County veld;<\/LI>GRSM_States: State naam wordt ingevuld in het State veld;<\/LI>GRSM_Sub_Ranger_Districts: Ranger District naam wordt ingevuld in het PARKDISTRICT veld;<\/LI>USGS_24K_TOPOMAP_BOUNDARIES: USGS Quad Naam wordt ingevuld in het QuadName veld;<\/LI>WATERSHEDS: HUC 12 Watershed Naam wordt ingevuld in het Watershed veld.<\/LI><\/LI><\/OL>Ons datapolicy is dat elk nieuw datapunt wordt toegeschreven met de "Name" waarde van elk van de 5 polygonen waarin het zich bevindt. Stel je de enthousiasme van data-editors voor wanneer ze te horen krijgen dat ze vijf keer een waarde uit een keuzelijst moeten kiezen voor elk nieuw punt dat ze toevoegen of bewerken!<\/P><\/P>Uitbreidend op Using SQL to Auto-Populate XY Values<\/A> kunnen we het nieuwe of bijgewerkte punt ruimtelijk "joinen" met elk van de 5 polygonen waarin het zich bevindt en de vereiste waarde uit de polygoon halen en schrijven naar het juiste attribuutveld.<\/P><\/P>ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/*\*\*\* fire on inserts and updates \*\*\*\*\/\/*\*\*\* disable trigger when SQL replication or mirroring is enabled \*\*\*\*\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/*\*\*\* hypothetically we could enter the lat\/lon as text and create a geography object \*\*\*\*\/ 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, \/*\*\*\* usual case point is created with ARC and casts the LAT\/LON as text \*\*\*\*\/\/*\*\*\* from the geography object \*\*\*\*\/ 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 \/*\*\*\* allow upate of lat\/lon on update \*\*\*\*\/ 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>Er is geen limiet aan het aantal joins dat je kunt gebruiken om ruimtelijke queries te automatiseren die attribuutwaarden bijwerken. Onthoud alleen dat beide feature classes die deelnemen aan de join hetzelfde opslagtype moeten gebruiken.<\/P><\/P>Maar wat als je dit op bestaande data wilt toepassen? Na het maken van de trigger kun je een eenmalige query uitvoeren om bestaande waarden bij te werken. Dit voorbeeld gebruikt het Geometry opslagtype:<\/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>Dit is een persoonlijke blog en beveelt de hierboven beschreven methoden niet aan, onderschrijft ze niet en ondersteunt ze niet. Het wijzigen van data met SQL buiten de ESRI software stack wordt uiteraard niet ondersteund en mag niet worden toegepast op een productie database zonder grondig begrip en een rampenherstelplan.<\/EM><\/P><\/BODY><\/HTML>
In dit voorbeeld heb ik de volgende administratieve grens polygon feature classes, allemaal geconfigureerd met het "Geography" opslagtype en SRID 4629 in dezelfde SDE-database.<\/P>
Ons datapolicy is dat elk nieuw datapunt wordt toegeschreven met de "Name" waarde van elk van de 5 polygonen waarin het zich bevindt. Stel je de enthousiasme van data-editors voor wanneer ze te horen krijgen dat ze vijf keer een waarde uit een keuzelijst moeten kiezen voor elk nieuw punt dat ze toevoegen of bewerken!<\/P>
Uitbreidend op
ALTER TRIGGER [dbo].[TEST_GEOGRAPHY]ON [dbo].[TEST]\/*\*\*\* fire on inserts and updates \*\*\*\*\/\/*\*\*\* disable trigger when SQL replication or mirroring is enabled \*\*\*\*\/after INSERT,UPDATE NOT FOR REPLICATIONAS BEGIN SET NOCOUNT ON; UPDATE p SET \/*\*\*\* hypothetically we could enter the lat\/lon as text and create a geography object \*\*\*\*\/ 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, \/*\*\*\* usual case point is created with ARC and casts the LAT\/LON as text \*\*\*\*\/\/*\*\*\* from the geography object \*\*\*\*\/ 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 \/*\*\*\* allow upate of lat\/lon on update \*\*\*\*\/ 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>Er is geen limiet aan het aantal joins dat je kunt gebruiken om ruimtelijke queries te automatiseren die attribuutwaarden bijwerken. Onthoud alleen dat beide feature classes die deelnemen aan de join hetzelfde opslagtype moeten gebruiken.<\/P><\/P>Maar wat als je dit op bestaande data wilt toepassen? Na het maken van de trigger kun je een eenmalige query uitvoeren om bestaande waarden bij te werken. Dit voorbeeld gebruikt het Geometry opslagtype:<\/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>Dit is een persoonlijke blog en beveelt de hierboven beschreven methoden niet aan, onderschrijft ze niet en ondersteunt ze niet. Het wijzigen van data met SQL buiten de ESRI software stack wordt uiteraard niet ondersteund en mag niet worden toegepast op een productie database zonder grondig begrip en een rampenherstelplan.<\/EM><\/P><\/BODY><\/HTML>
Aangemelde leden kunnen berichten plaatsen, updates volgen en meer. Nieuw hier? Registreer een gratis account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.