Zeel commited on
Commit
99b822c
·
1 Parent(s): 7f9b2ce

allow multiple polygons

Browse files
Files changed (2) hide show
  1. app.py +1 -1
  2. sandbox.ipynb +233 -0
app.py CHANGED
@@ -181,7 +181,7 @@ m.to_streamlit(height=height)
181
 
182
  # Metrics
183
  stats_df = pd.DataFrame()
184
- stats_df["Points"] = json.loads(geometry_gdf.to_crs(4326).to_json())["features"][0]["geometry"]["coordinates"]
185
  stats_df["Centroid"] = geometry_gdf.centroid.to_crs(4326).item()
186
  stats_df["Area (ha)"] = geometry_gdf.geometry.area.item() / 10000
187
  stats_df["Perimeter (m)"] = geometry_gdf.geometry.length.item()
 
181
 
182
  # Metrics
183
  stats_df = pd.DataFrame()
184
+ stats_df["Points"] = str(json.loads(geometry_gdf.to_crs(4326).to_json())["features"][0]["geometry"]["coordinates"])
185
  stats_df["Centroid"] = geometry_gdf.centroid.to_crs(4326).item()
186
  stats_df["Area (ha)"] = geometry_gdf.geometry.area.item() / 10000
187
  stats_df["Perimeter (m)"] = geometry_gdf.geometry.length.item()
sandbox.ipynb CHANGED
@@ -1,5 +1,238 @@
1
  {
2
  "cells": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  {
4
  "cell_type": "code",
5
  "execution_count": 10,
 
1
  {
2
  "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 27,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "data": {
10
+ "text/html": [
11
+ "<iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
12
+ "&lt;html&gt;\n",
13
+ "&lt;head&gt;\n",
14
+ " \n",
15
+ " &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
16
+ " \n",
17
+ " &lt;script&gt;\n",
18
+ " L_NO_TOUCH = false;\n",
19
+ " L_DISABLE_3D = false;\n",
20
+ " &lt;/script&gt;\n",
21
+ " \n",
22
+ " &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
23
+ " &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
24
+ " &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
25
+ " &lt;script src=&quot;https://code.jquery.com/jquery-3.7.1.min.js&quot;&gt;&lt;/script&gt;\n",
26
+ " &lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js&quot;&gt;&lt;/script&gt;\n",
27
+ " &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
28
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.css&quot;/&gt;\n",
29
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css&quot;/&gt;\n",
30
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css&quot;/&gt;\n",
31
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.2.0/css/all.min.css&quot;/&gt;\n",
32
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
33
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
34
+ " \n",
35
+ " &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
36
+ " initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
37
+ " &lt;style&gt;\n",
38
+ " #map_f1ce6eb921b4d7b11d49de3df8093d9e {\n",
39
+ " position: relative;\n",
40
+ " width: 100.0%;\n",
41
+ " height: 100.0%;\n",
42
+ " left: 0.0%;\n",
43
+ " top: 0.0%;\n",
44
+ " }\n",
45
+ " .leaflet-container { font-size: 1rem; }\n",
46
+ " &lt;/style&gt;\n",
47
+ " \n",
48
+ " &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet.fullscreen@3.0.0/Control.FullScreen.min.js&quot;&gt;&lt;/script&gt;\n",
49
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet.fullscreen@3.0.0/Control.FullScreen.css&quot;/&gt;\n",
50
+ " &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.2/leaflet.draw.js&quot;&gt;&lt;/script&gt;\n",
51
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.2/leaflet.draw.css&quot;/&gt;\n",
52
+ " &lt;script src=&quot;https://cdn.jsdelivr.net/gh/ljagis/leaflet-measure@2.1.7/dist/leaflet-measure.min.js&quot;&gt;&lt;/script&gt;\n",
53
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/ljagis/leaflet-measure@2.1.7/dist/leaflet-measure.min.css&quot;/&gt;\n",
54
+ " &lt;script src=&quot;https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js&quot;&gt;&lt;/script&gt;\n",
55
+ " &lt;link rel=&quot;stylesheet&quot; href=&quot;https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css&quot;/&gt;\n",
56
+ "&lt;/head&gt;\n",
57
+ "&lt;body&gt;\n",
58
+ " \n",
59
+ " \n",
60
+ " &lt;div class=&quot;folium-map&quot; id=&quot;map_f1ce6eb921b4d7b11d49de3df8093d9e&quot; &gt;&lt;/div&gt;\n",
61
+ " \n",
62
+ "&lt;/body&gt;\n",
63
+ "&lt;script&gt;\n",
64
+ " \n",
65
+ " \n",
66
+ " var map_f1ce6eb921b4d7b11d49de3df8093d9e = L.map(\n",
67
+ " &quot;map_f1ce6eb921b4d7b11d49de3df8093d9e&quot;,\n",
68
+ " {\n",
69
+ " center: [20.0, 0.0],\n",
70
+ " crs: L.CRS.EPSG3857,\n",
71
+ " zoom: 2,\n",
72
+ " zoomControl: true,\n",
73
+ " preferCanvas: false,\n",
74
+ " drawExport: false,\n",
75
+ " layersControl: true,\n",
76
+ " }\n",
77
+ " );\n",
78
+ " L.control.scale().addTo(map_f1ce6eb921b4d7b11d49de3df8093d9e);\n",
79
+ "\n",
80
+ " \n",
81
+ "\n",
82
+ " \n",
83
+ " \n",
84
+ " var tile_layer_625eed014e405c2ee851b9417f647dec = L.tileLayer(\n",
85
+ " &quot;https://tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
86
+ " {&quot;attribution&quot;: &quot;\\u0026copy; \\u003ca href=\\&quot;https://www.openstreetmap.org/copyright\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e contributors&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 19, &quot;maxZoom&quot;: 24, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
87
+ " );\n",
88
+ " \n",
89
+ " \n",
90
+ " tile_layer_625eed014e405c2ee851b9417f647dec.addTo(map_f1ce6eb921b4d7b11d49de3df8093d9e);\n",
91
+ " \n",
92
+ " \n",
93
+ " L.control.fullscreen(\n",
94
+ " {&quot;forceSeparateButton&quot;: false, &quot;position&quot;: &quot;topleft&quot;, &quot;title&quot;: &quot;Full Screen&quot;, &quot;titleCancel&quot;: &quot;Exit Full Screen&quot;}\n",
95
+ " ).addTo(map_f1ce6eb921b4d7b11d49de3df8093d9e);\n",
96
+ " \n",
97
+ " \n",
98
+ " var options = {\n",
99
+ " position: &quot;topleft&quot;,\n",
100
+ " draw: {},\n",
101
+ " edit: {},\n",
102
+ " }\n",
103
+ " // FeatureGroup is to store editable layers.\n",
104
+ " var drawnItems_draw_control_9dd44c4d87fa4af03ae29411df47a757 = new L.featureGroup().addTo(\n",
105
+ " map_f1ce6eb921b4d7b11d49de3df8093d9e\n",
106
+ " );\n",
107
+ " options.edit.featureGroup = drawnItems_draw_control_9dd44c4d87fa4af03ae29411df47a757;\n",
108
+ " var draw_control_9dd44c4d87fa4af03ae29411df47a757 = new L.Control.Draw(\n",
109
+ " options\n",
110
+ " ).addTo( map_f1ce6eb921b4d7b11d49de3df8093d9e );\n",
111
+ " map_f1ce6eb921b4d7b11d49de3df8093d9e.on(L.Draw.Event.CREATED, function(e) {\n",
112
+ " var layer = e.layer,\n",
113
+ " type = e.layerType;\n",
114
+ " var coords = JSON.stringify(layer.toGeoJSON());\n",
115
+ " layer.on(&#x27;click&#x27;, function() {\n",
116
+ " alert(coords);\n",
117
+ " console.log(coords);\n",
118
+ " });\n",
119
+ " drawnItems_draw_control_9dd44c4d87fa4af03ae29411df47a757.addLayer(layer);\n",
120
+ " });\n",
121
+ " map_f1ce6eb921b4d7b11d49de3df8093d9e.on(&#x27;draw:created&#x27;, function(e) {\n",
122
+ " drawnItems_draw_control_9dd44c4d87fa4af03ae29411df47a757.addLayer(e.layer);\n",
123
+ " });\n",
124
+ " \n",
125
+ " \n",
126
+ " \n",
127
+ " var measure_control_cd8157b3b01df939f478306bae2624de = new L.Control.Measure(\n",
128
+ " {&quot;position&quot;: &quot;bottomleft&quot;, &quot;primaryAreaUnit&quot;: &quot;sqmeters&quot;, &quot;primaryLengthUnit&quot;: &quot;meters&quot;, &quot;secondaryAreaUnit&quot;: &quot;acres&quot;, &quot;secondaryLengthUnit&quot;: &quot;miles&quot;});\n",
129
+ " map_f1ce6eb921b4d7b11d49de3df8093d9e.addControl(measure_control_cd8157b3b01df939f478306bae2624de);\n",
130
+ "\n",
131
+ " // Workaround for using this plugin with Leaflet&gt;=1.8.0\n",
132
+ " // https://github.com/ljagis/leaflet-measure/issues/171\n",
133
+ " L.Control.Measure.include({\n",
134
+ " _setCaptureMarkerIcon: function () {\n",
135
+ " // disable autopan\n",
136
+ " this._captureMarker.options.autoPanOnFocus = false;\n",
137
+ " // default function\n",
138
+ " this._captureMarker.setIcon(\n",
139
+ " L.divIcon({\n",
140
+ " iconSize: this._map.getSize().multiplyBy(2)\n",
141
+ " })\n",
142
+ " );\n",
143
+ " },\n",
144
+ " });\n",
145
+ "\n",
146
+ " \n",
147
+ " \n",
148
+ "\n",
149
+ " var geocoderOpts_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2 = {&quot;collapsed&quot;: true, &quot;defaultMarkGeocode&quot;: true, &quot;position&quot;: &quot;topleft&quot;, &quot;provider&quot;: &quot;nominatim&quot;, &quot;providerOptions&quot;: {}, &quot;zoom&quot;: 11};\n",
150
+ "\n",
151
+ " // note: geocoder name should start with lowercase\n",
152
+ " var geocoderName_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2 = geocoderOpts_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2[&quot;provider&quot;];\n",
153
+ "\n",
154
+ " var customGeocoder_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2 = L.Control.Geocoder[ geocoderName_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2 ](\n",
155
+ " geocoderOpts_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2[&#x27;providerOptions&#x27;]\n",
156
+ " );\n",
157
+ " geocoderOpts_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2[&quot;geocoder&quot;] = customGeocoder_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2;\n",
158
+ "\n",
159
+ " L.Control.geocoder(\n",
160
+ " geocoderOpts_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2\n",
161
+ " ).on(&#x27;markgeocode&#x27;, function(e) {\n",
162
+ " var zoom = geocoderOpts_geocoder_c3c41f24bdc9ab7c647dd5f6e71755d2[&#x27;zoom&#x27;] || map_f1ce6eb921b4d7b11d49de3df8093d9e.getZoom();\n",
163
+ " map_f1ce6eb921b4d7b11d49de3df8093d9e.setView(e.geocode.center, zoom);\n",
164
+ " }).addTo(map_f1ce6eb921b4d7b11d49de3df8093d9e);\n",
165
+ "\n",
166
+ " \n",
167
+ " \n",
168
+ " map_f1ce6eb921b4d7b11d49de3df8093d9e.fitBounds(\n",
169
+ " [[20, 0], [20, 0]],\n",
170
+ " {&quot;maxZoom&quot;: 2}\n",
171
+ " );\n",
172
+ " \n",
173
+ " \n",
174
+ " var macro_element_3831fc723f2cfc11a7f3230a34b4b9f6 = L.tileLayer.wms(\n",
175
+ " &quot;https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2016_Land_Cover_L48/wms?&quot;,\n",
176
+ " {&quot;attribution&quot;: &quot;&quot;, &quot;format&quot;: &quot;image/png&quot;, &quot;layers&quot;: &quot;NLCD_2016_Land_Cover_L48&quot;, &quot;styles&quot;: &quot;&quot;, &quot;transparent&quot;: true, &quot;version&quot;: &quot;1.1.1&quot;}\n",
177
+ " );\n",
178
+ " \n",
179
+ " \n",
180
+ " macro_element_3831fc723f2cfc11a7f3230a34b4b9f6.addTo(map_f1ce6eb921b4d7b11d49de3df8093d9e);\n",
181
+ " \n",
182
+ " \n",
183
+ " var layer_control_293101c4cdf231dcd55e9b691be121de_layers = {\n",
184
+ " base_layers : {\n",
185
+ " &quot;openstreetmap&quot; : tile_layer_625eed014e405c2ee851b9417f647dec,\n",
186
+ " },\n",
187
+ " overlays : {\n",
188
+ " &quot;NLCD 2016 CONUS Land Cover&quot; : macro_element_3831fc723f2cfc11a7f3230a34b4b9f6,\n",
189
+ " },\n",
190
+ " };\n",
191
+ " let layer_control_293101c4cdf231dcd55e9b691be121de = L.control.layers(\n",
192
+ " layer_control_293101c4cdf231dcd55e9b691be121de_layers.base_layers,\n",
193
+ " layer_control_293101c4cdf231dcd55e9b691be121de_layers.overlays,\n",
194
+ " {&quot;autoZIndex&quot;: true, &quot;collapsed&quot;: true, &quot;position&quot;: &quot;topright&quot;}\n",
195
+ " ).addTo(map_f1ce6eb921b4d7b11d49de3df8093d9e);\n",
196
+ "\n",
197
+ " \n",
198
+ "&lt;/script&gt;\n",
199
+ "&lt;/html&gt;\" width=\"100%\" height=\"600\"style=\"border:none !important;\" \"allowfullscreen\" \"webkitallowfullscreen\" \"mozallowfullscreen\"></iframe>"
200
+ ],
201
+ "text/plain": [
202
+ "<leafmap.foliumap.Map at 0x7f2341d2cca0>"
203
+ ]
204
+ },
205
+ "execution_count": 27,
206
+ "metadata": {},
207
+ "output_type": "execute_result"
208
+ }
209
+ ],
210
+ "source": [
211
+ "import leafmap as leafmap\n",
212
+ "import leafmap.foliumap as leaf_folium\n",
213
+ "import leafmap.toolbar\n",
214
+ "# import leafmap.toolbar as toolbar\n",
215
+ "\n",
216
+ "tmp_map = leafmap.Map()\n",
217
+ "\n",
218
+ "Map = leaf_folium.Map()\n",
219
+ "\n",
220
+ "url = \"https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2016_Land_Cover_L48/wms?\"\n",
221
+ "Map.add_wms_layer(\n",
222
+ " url,\n",
223
+ " layers=\"NLCD_2016_Land_Cover_L48\",\n",
224
+ " name=\"NLCD 2016 CONUS Land Cover\",\n",
225
+ " format=\"image/png\",\n",
226
+ " transparent=True,\n",
227
+ ")\n",
228
+ "# Map.add_legend(builtin_legend=\"NLCD\", draggable=False)\n",
229
+ "Map.sandbox_path = \"/home/patel_zeel/bhuvan\"\n",
230
+ "# toolbar.tool_template(Map)\n",
231
+ "\n",
232
+ "Map.toolbar = tmp_map.toolbar\n",
233
+ "Map"
234
+ ]
235
+ },
236
  {
237
  "cell_type": "code",
238
  "execution_count": 10,