Aktualizace původního skriptu v komentářích níže - 5.9.2019<\/EM><\/P><\/P>S příchodem hurikánové sezóny jsem chtěl sdílet jednoduchý, ale výkonný python skript, který lokalizuje aktiva nacházející se na cestě hlavní bouře. Skript využívá ArcGIS Python API<\/A> a může být spuštěn ručně nebo automaticky z různých zdrojů, které si později představím. Skript také vyžaduje, aby vaše umístění aktiv byla ve feature layer ve vašem GIS portálu, spolu s polygonovou feature layer používanou jako trajektorie bouře a vrstvu pro přidání vašich alarmů nebo zranitelných aktiv. Skript je přiložen níže, ale nejdříve si ho rozložíme.<\/P><\/P>Nejprve importujte potřebné ArcGIS python knihovny a autentizujte se do vašeho GIS portálu. Protože tento skript používá feature layers, budeme většinou používat modul arcgis.features.<\/P><SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>gis <SPAN class="keyword token">import<\/SPAN> GIS <SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>features <SPAN class="keyword token">import<\/SPAN> FeatureLayer <SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>features<SPAN class="punctuation token">.<\/SPAN>managers <SPAN class="keyword token">import<\/SPAN> FeatureLayerManager <SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>geometry <SPAN class="keyword token">import<\/SPAN> filters <SPAN class="keyword token">from<\/SPAN> IPython<SPAN class="punctuation token">.<\/SPAN>display <SPAN class="keyword token">import<\/SPAN> display gis <SPAN class="operator token">=<\/SPAN> GIS<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">"https:\/\/your.portal.here\/"<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">'username'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">'password'<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><\/span><\/CODE><\/PRE><P><\/P><P>Dále načteme feature layers použité ve skriptu. Skript vyžaduje bodovou feature layer vašich umístění aktiv, polygonovou feature layer trajektorie bouře a další bodovou vrstvu používanou jako alarmy nebo umístění vašich zranitelných aktiv.<\/P><P><\/P><P><EM><STRONG>Ninja Pro Tip:<\/STRONG> Využijte <A href="http:\/\/www.arcgis.com\/home\/item.html?id=248e7b5827a34b248647afb012c58787" rel="nofollow noopener noreferrer" target="_blank">Active Hurricane live feed<\/A> z Esri Living Atlas jako vaši trajektorii bouře.<\/EM><\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="comment token">#assets layer<\/span> cellSiteFeatureLayer <span class="operator token">=<\/span> gis<span class="punctuation token">.<\/span>content<span class="punctuation token">.<\/span>get<span class="punctuation token">(<\/span><span class="string token">'88b5acd4444343b3bdaea40918d070bf'<\/span><span class="punctuation token">)<\/span> <span class="comment token">#storm track layer<\/span> hurricaneFeatureLayer <span class="operator token">=<\/span> gis<span class="punctuation token">.<\/span>content<span class="punctuation token">.<\/span>get<span class="punctuation token">(<\/span><span class="string token">'6c8256c93c0e40debe46d9dcf79d0049'<\/span><span class="punctuation token">)<\/span> <span class="comment token">#alarms layer<\/span> warningsFeatureLayer <span class="operator token">=<\/span> gis<span class="punctuation token">.<\/span>content<span class="punctuation token">.<\/span>get<span class="punctuation token">(<\/span><span class="string token">'6f735776f0c246b1ba602a774dbc1b1d'<\/span><span class="punctuation token">)<\/span>Dále ořízneme a vyčistíme předchozí alarmy a zranitelná aktiva z vrstev alarmů.<\/P><\/P>Patrick Huls<\/STRONG><\/SPAN><\/P>
<\/P>
Nejprve importujte potřebné ArcGIS python knihovny a autentizujte se do vašeho GIS portálu. Protože tento skript používá feature layers, budeme většinou používat modul arcgis.features.<\/P>
<SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>gis <SPAN class="keyword token">import<\/SPAN> GIS <SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>features <SPAN class="keyword token">import<\/SPAN> FeatureLayer <SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>features<SPAN class="punctuation token">.<\/SPAN>managers <SPAN class="keyword token">import<\/SPAN> FeatureLayerManager <SPAN class="keyword token">from<\/SPAN> arcgis<SPAN class="punctuation token">.<\/SPAN>geometry <SPAN class="keyword token">import<\/SPAN> filters <SPAN class="keyword token">from<\/SPAN> IPython<SPAN class="punctuation token">.<\/SPAN>display <SPAN class="keyword token">import<\/SPAN> display gis <SPAN class="operator token">=<\/SPAN> GIS<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">"https:\/\/your.portal.here\/"<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">'username'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">'password'<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><\/span><\/CODE><\/PRE><P><\/P><P>Dále načteme feature layers použité ve skriptu. Skript vyžaduje bodovou feature layer vašich umístění aktiv, polygonovou feature layer trajektorie bouře a další bodovou vrstvu používanou jako alarmy nebo umístění vašich zranitelných aktiv.<\/P><P><\/P><P><EM><STRONG>Ninja Pro Tip:<\/STRONG> Využijte <A href="http:\/\/www.arcgis.com\/home\/item.html?id=248e7b5827a34b248647afb012c58787" rel="nofollow noopener noreferrer" target="_blank">Active Hurricane live feed<\/A> z Esri Living Atlas jako vaši trajektorii bouře.<\/EM><\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="comment token">#assets layer<\/span> cellSiteFeatureLayer <span class="operator token">=<\/span> gis<span class="punctuation token">.<\/span>content<span class="punctuation token">.<\/span>get<span class="punctuation token">(<\/span><span class="string token">'88b5acd4444343b3bdaea40918d070bf'<\/span><span class="punctuation token">)<\/span> <span class="comment token">#storm track layer<\/span> hurricaneFeatureLayer <span class="operator token">=<\/span> gis<span class="punctuation token">.<\/span>content<span class="punctuation token">.<\/span>get<span class="punctuation token">(<\/span><span class="string token">'6c8256c93c0e40debe46d9dcf79d0049'<\/span><span class="punctuation token">)<\/span> <span class="comment token">#alarms layer<\/span> warningsFeatureLayer <span class="operator token">=<\/span> gis<span class="punctuation token">.<\/span>content<span class="punctuation token">.<\/span>get<span class="punctuation token">(<\/span><span class="string token">'6f735776f0c246b1ba602a774dbc1b1d'<\/span><span class="punctuation token">)<\/span>
Dále ořízneme a vyčistíme předchozí alarmy a zranitelná aktiva z vrstev alarmů.
<\/P><\/P>Patrick Huls<\/STRONG><\/SPAN><\/P>
LinkedIn:
For larger datasets, is best to chunk up the queried results and add them to your alarms layer in chunks. Here are some modifications to the code to allow for sending the edits in chunks of 1000.
cellSiteFeatures <SPAN class="operator token">=</SPAN> cellSiteFeatureLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> hurricaneFeatures <SPAN class="operator token">=</SPAN> hurricaneFeatureLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">]</SPAN> queryHurricane <SPAN class="operator token">=</SPAN> hurricaneFeatures<SPAN class="punctuation token">.</SPAN>query<SPAN class="punctuation token">(</SPAN>where<SPAN class="operator token">=</SPAN><SPAN class="string token">'1=1'</SPAN><SPAN class="punctuation token">,</SPAN> out_sr<SPAN class="operator token">=</SPAN><SPAN class="string token">"102100"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN> <SPAN class="punctuation token">(</SPAN>queryHurricane<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> feature <SPAN class="keyword token">in</SPAN> queryHurricane<SPAN class="punctuation token">:</SPAN> geometryHurricane <SPAN class="operator token">=</SPAN> feature<SPAN class="punctuation token">.</SPAN>geometry warningName <SPAN class="operator token">=</SPAN> feature<SPAN class="punctuation token">.</SPAN>get_value<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'STORMNAME'</SPAN><SPAN class="punctuation token">)</SPAN> warningInfo <SPAN class="operator token">=</SPAN> <SPAN class="string token">''</SPAN> warningType <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Hurricane'</SPAN> warningsResult <SPAN class="operator token">=</SPAN> cellSiteFeatures<SPAN class="punctuation token">.</SPAN>query<SPAN class="punctuation token">(</SPAN>where<SPAN class="operator token">=</SPAN><SPAN class="string token">'1=1'</SPAN><SPAN class="punctuation token">,</SPAN> out_fields<SPAN class="operator token">=</SPAN><SPAN class="string token">'*'</SPAN><SPAN class="punctuation token">,</SPAN> geometry_filter<SPAN class="operator token">=</SPAN>filters<SPAN class="punctuation token">.</SPAN>intersects<SPAN class="punctuation token">(</SPAN>geometryHurricane<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> warningsResult<SPAN class="punctuation token">:</SPAN> f<SPAN class="punctuation token">.</SPAN>attributes<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'Warning_Name'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">=</SPAN>warningName f<SPAN class="punctuation token">.</SPAN>attributes<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'Warning_Type'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">=</SPAN>warningType warningsResultSdf <SPAN class="operator token">=</SPAN> warningsResult<SPAN class="punctuation token">.</SPAN>sdf <SPAN class="comment token">#Yield successive n-sized chunks from l</SPAN> <SPAN class="keyword token">def</SPAN> <SPAN class="token function">chunks</SPAN><SPAN class="punctuation token">(</SPAN>l<SPAN class="punctuation token">,</SPAN> n<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> range<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> len<SPAN class="punctuation token">(</SPAN>l<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> n<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">yield</SPAN> l<SPAN class="punctuation token">[</SPAN>i<SPAN class="punctuation token">:</SPAN>i <SPAN class="operator token">+</SPAN> n<SPAN class="punctuation token">]</SPAN> <SPAN class="comment token">#add vulnerable asset locations to alarms layer w/ storm info</SPAN> <SPAN class="keyword token">for</SPAN> chunk <SPAN class="keyword token">in</SPAN> chunks<SPAN class="punctuation token">(</SPAN>warningsResultSdf<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">1000</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> warningsLayer<SPAN class="punctuation token">.</SPAN>edit_features<SPAN class="punctuation token">(</SPAN>adds<SPAN class="operator token">=</SPAN>FeatureSet<SPAN class="punctuation token">.</SPAN>from_dataframe<SPAN class="punctuation token">(</SPAN>chunk<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN> <SPAN class="punctuation token">(</SPAN>chunk<SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Additional lines of code to store attributes of the storm and add those to the warning layer.
cellSiteFeatures <SPAN class="operator token">=</SPAN> cellSiteFeatureLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> hurricaneFeatures <SPAN class="operator token">=</SPAN> hurricaneFeatureLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">]</SPAN> queryHurricane <SPAN class="operator token">=</SPAN> hurricaneFeatures<SPAN class="punctuation token">.</SPAN>query<SPAN class="punctuation token">(</SPAN>where<SPAN class="operator token">=</SPAN><SPAN class="string token">'1=1'</SPAN><SPAN class="punctuation token">,</SPAN> out_sr<SPAN class="operator token">=</SPAN><SPAN class="string token">"102100"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> feature <SPAN class="keyword token">in</SPAN> queryHurricane<SPAN class="punctuation token">:</SPAN> geometryHurricane <SPAN class="operator token">=</SPAN> feature<SPAN class="punctuation token">.</SPAN>geometry warningName <SPAN class="operator token">=</SPAN> feature<SPAN class="punctuation token">.</SPAN>get_value<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'STORMNAME'</SPAN><SPAN class="punctuation token">)</SPAN> warningType <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Hurricane'</SPAN> warningsResult <SPAN class="operator token">=</SPAN> cellSiteFeatures<SPAN class="punctuation token">.</SPAN>query<SPAN class="punctuation token">(</SPAN>where<SPAN class="operator token">=</SPAN><SPAN class="string token">'1=1'</SPAN><SPAN class="punctuation token">,</SPAN> out_fields<SPAN class="operator token">=</SPAN><SPAN class="string token">'*'</SPAN><SPAN class="punctuation token">,</SPAN> geometry_filter<SPAN class="operator token">=</SPAN>filters<SPAN class="punctuation token">.</SPAN>intersects<SPAN class="punctuation token">(</SPAN>geometryHurricane<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="comment token">#add vurnerable asset locations to alarms layer w/ storm name</SPAN> <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> warningsResult<SPAN class="punctuation token">:</SPAN> f<SPAN class="punctuation token">.</SPAN>attributes<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'Warning_Name'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">=</SPAN>warningName f<SPAN class="punctuation token">.</SPAN>attributes<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'Warning_Type'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">=</SPAN>warningType warningsLayer<SPAN class="punctuation token">.</SPAN>edit_features<SPAN class="punctuation token">(</SPAN>adds<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN>f<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>f<SPAN class="punctuation token">)</SPAN> <SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
A user asked me if this analysis can be run using a feature layer that contains multiple polygons (just in case there are multiple storms occurring), and the answer is yes. Here are necessary modifications:
Add a for loop to iterate through each feature in the feature layer and run the asset query using the geometry from each feature.
cellSiteFeatures <SPAN class="operator token">=</SPAN> cellSiteFeatureLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> hurricaneFeatures <SPAN class="operator token">=</SPAN> hurricaneFeatureLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">]</SPAN> queryHurricane <SPAN class="operator token">=</SPAN> hurricaneFeatures<SPAN class="punctuation token">.</SPAN>query<SPAN class="punctuation token">(</SPAN>where<SPAN class="operator token">=</SPAN><SPAN class="string token">'1=1'</SPAN><SPAN class="punctuation token">,</SPAN> out_sr<SPAN class="operator token">=</SPAN><SPAN class="string token">"102100"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> feature <SPAN class="keyword token">in</SPAN> queryHurricane<SPAN class="punctuation token">:</SPAN> geometryHurricane <SPAN class="operator token">=</SPAN> feature<SPAN class="punctuation token">.</SPAN>geometry warningsResult <SPAN class="operator token">=</SPAN> cellSiteFeatures<SPAN class="punctuation token">.</SPAN>query<SPAN class="punctuation token">(</SPAN>where<SPAN class="operator token">=</SPAN><SPAN class="string token">'1=1'</SPAN><SPAN class="punctuation token">,</SPAN> out_fields<SPAN class="operator token">=</SPAN><SPAN class="string token">'SiteID'</SPAN><SPAN class="punctuation token">,</SPAN> geometry_filter<SPAN class="operator token">=</SPAN>filters<SPAN class="punctuation token">.</SPAN>intersects<SPAN class="punctuation token">(</SPAN>geometryHurricane<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> warningsLayer<SPAN class="punctuation token">.</SPAN>edit_features<SPAN class="punctuation token">(</SPAN>adds<SPAN class="operator token">=</SPAN>warningsResult<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>warningsResult<SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
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.