# Script to make a webmap from WFS data. import os import urllib from osgeo import ogr import folium def get_bbox(geom): """Return the bbox based on a geometry envelope.""" return '{0},{2},{1},{3}'.format(*geom.GetEnvelope()) def get_center(geom): """Return the center point of a geometry.""" centroid = geom.Centroid() return [centroid.GetY(), centroid.GetX()] def get_state_geom(state_name): """Return the geometry for a state.""" ds = ogr.Open(r'D:\osgeopy-data\US\states.geojson') if ds is None: raise RuntimeError( 'Could not open the states dataset. Is the path correct?') lyr = ds.GetLayer() lyr.SetAttributeFilter('state = "{0}"'.format(state_name)) feat = next(lyr) return feat.geometry().Clone() def save_state_gauges(out_fn, bbox=None): """Save stream gauge data to a geojson file.""" url = 'http://gis.srh.noaa.gov/arcgis/services/ahps_gauges/' + \ 'MapServer/WFSServer' parms = { 'version': '1.1.0', 'typeNames': 'ahps_gauges:Observed_River_Stages', 'srsName': 'urn:ogc:def:crs:EPSG:6.9:4326', } if bbox: parms['bbox'] = bbox try: request = 'WFS:{0}?{1}'.format(url, urllib.urlencode(parms)) except: request = 'WFS:{0}?{1}'.format(url, urllib.parse.urlencode(parms)) wfs_ds = ogr.Open(request) if wfs_ds is None: raise RuntimeError('Could not open WFS.') wfs_lyr = wfs_ds.GetLayer(0) driver = ogr.GetDriverByName('GeoJSON') if os.path.exists(out_fn): driver.DeleteDataSource(out_fn) json_ds = driver.CreateDataSource(out_fn) json_ds.CopyLayer(wfs_lyr, '') def make_map(state_name, json_fn, html_fn, **kwargs): """Make a folium map.""" geom = get_state_geom(state_name) save_state_gauges(json_fn, get_bbox(geom)) fmap = folium.Map(location=get_center(geom), **kwargs) fmap.geo_json(geo_path=json_fn) fmap.create_map(path=html_fn) # Top-level code. Don't forget to change the directory. The if-statement # makes it so that the next two lines of code only run if this script is # being run as a stand-alone script. This way you can import this file # into listing 4.4 and this part won't run, but you'll have access to all # of the above functions. if __name__ == "__main__": os.chdir(r'D:\Dropbox\Public\webmaps') make_map('Oklahoma', 'ok.json', 'ok.html', zoom_start=7) # You can look at the capabilities output for this WFS here: # http://gis.srh.noaa.gov/arcgis/services/ahps_gauges/MapServer/WFSServer?request=GetCapabilities # And info for all services from this site here: # http://gis.srh.noaa.gov/arcgis/rest/services