Skip to content

Commit 9bd8f7a

Browse files
committed
fix: interactive control of map
fix: multipolygons for cmr requests for dateline polys refactor: logging for verbose io output feat: include prefer canvas parameter for leaflet maps
1 parent b1c6f75 commit 9bd8f7a

File tree

4 files changed

+58
-51
lines changed

4 files changed

+58
-51
lines changed

examples/voila_demo.ipynb

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"import warnings\n",
7474
"import time\n",
7575
"import json\n",
76-
"from IPython.display import clear_output\n",
76+
"from IPython import display\n",
7777
"# atl03 plotting imports\n",
7878
"import numpy as np\n",
7979
"import matplotlib.lines\n",
@@ -158,12 +158,18 @@
158158
},
159159
"outputs": [],
160160
"source": [
161-
"# create ipyleaflet map in specified projection\n",
162-
"m = ipysliderule.leaflet(SRwidgets.projection.value)\n",
163-
"# install click handler callback\n",
164-
"m.add_selected_callback(SRwidgets.atl06_click_handler)\n",
165-
"display(m.map)\n",
166-
"display(run_output)"
161+
"def create_map(projection):\n",
162+
" # create ipyleaflet map in specified projection\n",
163+
" global m\n",
164+
" m = ipysliderule.leaflet(projection)\n",
165+
" # install click handler callback\n",
166+
" m.add_selected_callback(SRwidgets.atl06_click_handler)\n",
167+
" # out.append_display_data(display.display(m.map))\n",
168+
" display.display(m.map)\n",
169+
"\n",
170+
"out = widgets.interactive_output(create_map, dict(projection=SRwidgets.projection))\n",
171+
"display.display(out)\n",
172+
"display.display(run_output)"
167173
]
168174
},
169175
{
@@ -189,17 +195,17 @@
189195
" layers=SRwidgets.layers.value,\n",
190196
" rendering_rule=SRwidgets.rendering_rule\n",
191197
" )\n",
192-
" \n",
198+
"\n",
193199
"# map widgets\n",
194-
"display(widgets.VBox([\n",
200+
"display.display(widgets.VBox([\n",
195201
" SRwidgets.projection,\n",
196202
" SRwidgets.layers,\n",
197203
" SRwidgets.raster_functions\n",
198204
"]))\n",
199205
"\n",
200206
"# update button\n",
201207
"update_button.on_click(on_update_clicked)\n",
202-
"display(update_button)"
208+
"display.display(update_button)"
203209
]
204210
},
205211
{
@@ -317,7 +323,7 @@
317323
"def on_show_code06_clicked(b):\n",
318324
" global url_textbox, atl06_parms\n",
319325
" with show_code06_output:\n",
320-
" clear_output()\n",
326+
" display.clear_output()\n",
321327
" print(f'icesat2.init(\"{url_textbox.value}\")')\n",
322328
" print('parms = ', json.dumps(atl06_parms, indent=4), sep='')\n",
323329
" print('gdf = icesat2.atl06p(parms, asset=\"nsidc-s3\")')\n",
@@ -355,7 +361,7 @@
355361
" description='URL:',\n",
356362
" disabled=False\n",
357363
")\n",
358-
"display(url_textbox)\n",
364+
"display.display(url_textbox)\n",
359365
"\n",
360366
"# points to plot drop down\n",
361367
"points_dropdown = widgets.Dropdown(\n",
@@ -366,7 +372,7 @@
366372
")\n",
367373
"\n",
368374
"# display widgets for setting SlideRule parameters\n",
369-
"display(widgets.VBox([\n",
375+
"display.display(widgets.VBox([\n",
370376
" SRwidgets.surface_type,\n",
371377
" SRwidgets.length,\n",
372378
" SRwidgets.step,\n",
@@ -384,9 +390,9 @@
384390
"]))\n",
385391
"\n",
386392
"# display buttons\n",
387-
"display(run_button)\n",
388-
"display(refresh_button, refresh_output)\n",
389-
"display(show_code06_button, show_code06_output)"
393+
"display.display(run_button)\n",
394+
"display.display(refresh_button, refresh_output)\n",
395+
"display.display(show_code06_button, show_code06_output)"
390396
]
391397
},
392398
{
@@ -553,7 +559,7 @@
553559
"def on_show_code03_clicked(b):\n",
554560
" global url_textbox, atl03_parms\n",
555561
" with show_code03_output:\n",
556-
" clear_output()\n",
562+
" display.clear_output()\n",
557563
" print(f'icesat2.init(\"{url_textbox.value}\")')\n",
558564
" print('parms = ', json.dumps(atl03_parms, indent=4), sep='')\n",
559565
" print('gdf = icesat2.atl03sp(parms, asset=\"nsidc-s3\")')\n",
@@ -590,14 +596,14 @@
590596
" disabled = False,\n",
591597
")\n",
592598
"\n",
593-
"display(SRwidgets.rgt)\n",
594-
"display(SRwidgets.cycle)\n",
595-
"display(SRwidgets.ground_track)\n",
596-
"display(SRwidgets.plot_classification)\n",
597-
"display(elev_dropdown)\n",
598-
"display(pc_button)\n",
599-
"display(pc_output)\n",
600-
"display(show_code03_button, show_code03_output)"
599+
"display.display(SRwidgets.rgt)\n",
600+
"display.display(SRwidgets.cycle)\n",
601+
"display.display(SRwidgets.ground_track)\n",
602+
"display.display(SRwidgets.plot_classification)\n",
603+
"display.display(elev_dropdown)\n",
604+
"display.display(pc_button)\n",
605+
"display.display(pc_output)\n",
606+
"display.display(show_code03_button, show_code03_output)"
601607
]
602608
}
603609
],
@@ -635,7 +641,7 @@
635641
"name": "python",
636642
"nbconvert_exporter": "python",
637643
"pygments_lexer": "ipython3",
638-
"version": "3.8.15"
644+
"version": "3.10.6"
639645
},
640646
"toc-showtags": false
641647
},

sliderule/icesat2.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ def __cmr_granule_metadata(search_results):
191191
for e in search_results['feed']['entry']:
192192
# columns for dataframe
193193
columns = {}
194+
# granule title and identifiers
195+
columns['title'] = e['title']
196+
columns['collection_concept_id'] = e['collection_concept_id']
194197
# time start and time end of granule
195198
columns['time_start'] = numpy.datetime64(e['time_start'])
196199
columns['time_end'] = numpy.datetime64(e['time_end'])
@@ -202,8 +205,13 @@ def __cmr_granule_metadata(search_results):
202205
df = geopandas.pd.DataFrame(columns, index=[e['id']])
203206
# Generate Geometry Column
204207
if 'polygons' in e:
205-
coords = [float(i) for i in e['polygons'][0][0].split()]
206-
geometry = Polygon(zip(coords[1::2], coords[::2]))
208+
polygons = []
209+
# for each polygon
210+
for poly in e['polygons'][0]:
211+
coords = [float(i) for i in poly.split()]
212+
polygons.append(Polygon(zip(coords[1::2], coords[::2])))
213+
# generate multipolygon from list of polygons
214+
geometry = MultiPolygon(polygons)
207215
else:
208216
geometry, = geopandas.points_from_xy([None], [None])
209217
# Build GeoDataFrame (default geometry is crs=EPSG_MERCATOR)

sliderule/io.py

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import sys
3131
import json
32+
import logging
3233
import warnings
3334
import datetime
3435
import geopandas
@@ -49,8 +50,8 @@ def get_attributes(**kwargs):
4950
# set default keyword arguments
5051
kwargs.setdefault('lon_key','longitude')
5152
kwargs.setdefault('lat_key','latitude')
52-
coordinates = '{lat_key} {lon_key}'.format(**kwargs)
5353
lon_key,lat_key = (kwargs['lon_key'],kwargs['lat_key'])
54+
coordinates = f'{lat_key} {lon_key}'
5455
attrs = {}
5556
# file level attributes
5657
attrs['featureType'] = 'trajectory'
@@ -326,7 +327,6 @@ def to_json(filename, **kwargs):
326327
kwargs.setdefault('parameters',None)
327328
kwargs.setdefault('regions',[])
328329
kwargs.setdefault('crs','EPSG:4326')
329-
kwargs.setdefault('verbose',False)
330330
# add each parameter as an attribute
331331
SRparams = ['H_min_win', 'atl08_class', 'atl03_quality', 'ats', 'cnf',
332332
'cnt', 'len', 'maxi', 'res', 'sigma_r_max', 'srt', 'yapc']
@@ -355,21 +355,17 @@ def to_json(filename, **kwargs):
355355
with open(filename, 'w') as fid:
356356
json.dump(output, fid)
357357
# print the filename and dictionary structure
358-
if kwargs['verbose']:
359-
print(filename)
360-
print(list(output.keys()))
358+
logging.info(filename)
359+
logging.info(list(output.keys()))
361360

362361
# read request parameters and regions from JSON
363362
def from_json(filename, **kwargs):
364-
# set default keyword arguments
365-
kwargs.setdefault('verbose',False)
366363
# load the JSON file
367364
with open(filename, 'r') as fid:
368365
attributes = json.load(fid)
369366
# print the filename and dictionary structure
370-
if kwargs['verbose']:
371-
print(filename)
372-
print(list(attributes.keys()))
367+
logging.info(filename)
368+
logging.info(list(attributes.keys()))
373369
# try to get the sliderule adjustable parameters
374370
SRparams = ['H_min_win', 'atl08_class', 'atl03_quality', 'ats', 'cnf',
375371
'cnt', 'len', 'maxi', 'res', 'sigma_r_max', 'srt', 'yapc']
@@ -397,7 +393,6 @@ def to_nc(gdf, filename, **kwargs):
397393
# set default keyword arguments
398394
kwargs.setdefault('parameters',None)
399395
kwargs.setdefault('regions',[])
400-
kwargs.setdefault('verbose',False)
401396
kwargs.setdefault('crs','EPSG:4326')
402397
kwargs.setdefault('lon_key','longitude')
403398
kwargs.setdefault('lat_key','latitude')
@@ -473,9 +468,8 @@ def to_nc(gdf, filename, **kwargs):
473468
setattr(fileID, 'poly{0:d}_x'.format(i), json.dumps(lon))
474469
setattr(fileID, 'poly{0:d}_y'.format(i), json.dumps(lat))
475470
# Output netCDF structure information
476-
if kwargs['verbose']:
477-
print(filename)
478-
print(list(fileID.variables.keys()))
471+
logging.info(filename)
472+
logging.info(list(fileID.variables.keys()))
479473
# Closing the netCDF file
480474
fileID.close()
481475
warnings.filterwarnings("default")
@@ -576,7 +570,6 @@ def to_hdf(gdf, filename, **kwargs):
576570
kwargs.setdefault('driver','pytables')
577571
kwargs.setdefault('parameters',None)
578572
kwargs.setdefault('regions',[])
579-
kwargs.setdefault('verbose',False)
580573
kwargs.setdefault('crs','EPSG:4326')
581574
kwargs.setdefault('lon_key','longitude')
582575
kwargs.setdefault('lat_key','latitude')
@@ -606,7 +599,6 @@ def write_pytables(df, filename, attributes, **kwargs):
606599
# set default keyword arguments
607600
kwargs.setdefault('parameters',None)
608601
kwargs.setdefault('regions',[])
609-
kwargs.setdefault('verbose',False)
610602
kwargs.setdefault('crs','EPSG:4326')
611603
# write data to a pytables HDF5 file
612604
df.to_hdf(filename, 'sliderule_segments', format="table", mode="w")
@@ -655,9 +647,8 @@ def write_pytables(df, filename, attributes, **kwargs):
655647
setattr(fileID.root._v_attrs, 'poly{0:d}_x'.format(i), json.dumps(lon))
656648
setattr(fileID.root._v_attrs, 'poly{0:d}_y'.format(i), json.dumps(lat))
657649
# Output HDF5 structure information
658-
if kwargs['verbose']:
659-
print(filename)
660-
print(fileID.get_storer('sliderule_segments').non_index_axes[0][1])
650+
logging.info(filename)
651+
logging.info(fileID.get_storer('sliderule_segments').non_index_axes[0][1])
661652
# Closing the HDF5 file
662653
fileID.close()
663654

@@ -666,7 +657,6 @@ def write_h5py(df, filename, attributes, **kwargs):
666657
# set default keyword arguments
667658
kwargs.setdefault('parameters',None)
668659
kwargs.setdefault('regions',[])
669-
kwargs.setdefault('verbose',False)
670660
kwargs.setdefault('crs','EPSG:4326')
671661
# open HDF5 file object
672662
fileID = h5py.File(filename, mode='w')
@@ -736,9 +726,8 @@ def write_h5py(df, filename, attributes, **kwargs):
736726
fileID.attrs['poly{0:d}_x'.format(i)] = json.dumps(lon)
737727
fileID.attrs['poly{0:d}_y'.format(i)] = json.dumps(lat)
738728
# Output HDF5 structure information
739-
if kwargs['verbose']:
740-
print(filename)
741-
print(list(fileID.keys()))
729+
logging.info(filename)
730+
logging.info(list(fileID.keys()))
742731
# Closing the HDF5 file
743732
fileID.close()
744733

sliderule/ipysliderule.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,7 @@ class leaflet:
16211621
def __init__(self, projection, **kwargs):
16221622
# set default keyword arguments
16231623
kwargs.setdefault('map',None)
1624+
kwargs.setdefault('prefer_canvas',False)
16241625
kwargs.setdefault('attribution',False)
16251626
kwargs.setdefault('zoom_control',False)
16261627
kwargs.setdefault('scale_control',False)
@@ -1632,12 +1633,14 @@ def __init__(self, projection, **kwargs):
16321633
if (projection == 'Global'):
16331634
self.map = ipyleaflet.Map(center=kwargs['center'],
16341635
zoom=9, max_zoom=15, world_copy_jump=True,
1636+
prefer_canvas=kwargs['prefer_canvas'],
16351637
attribution_control=kwargs['attribution'],
16361638
basemap=ipyleaflet.basemaps.Esri.WorldTopoMap)
16371639
self.crs = 'EPSG:3857'
16381640
elif (projection == 'North'):
16391641
self.map = ipyleaflet.Map(center=(90,0),
16401642
zoom=5, max_zoom=24,
1643+
prefer_canvas=kwargs['prefer_canvas'],
16411644
attribution_control=kwargs['attribution'],
16421645
basemap=ipyleaflet.basemaps.Esri.ArcticOceanBase,
16431646
crs=ipyleaflet.projections.EPSG5936.ESRIBasemap)
@@ -1648,6 +1651,7 @@ def __init__(self, projection, **kwargs):
16481651
elif (projection == 'South'):
16491652
self.map = ipyleaflet.Map(center=(-90,0),
16501653
zoom=2, max_zoom=9,
1654+
prefer_canvas=kwargs['prefer_canvas'],
16511655
attribution_control=kwargs['attribution'],
16521656
basemap=ipyleaflet.basemaps.Esri.AntarcticBasemap,
16531657
crs=ipyleaflet.projections.EPSG3031.ESRIBasemap)

0 commit comments

Comments
 (0)