Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions knime_extension/pixi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ pygeoda = "0.1.2.*"
pointpats = "2.5.1.*"
pulp = "2.8.0.*"
keplergl = "*"
contextily = "1.6.2"

[pypi-dependencies]
ipinfo = "==5.1.1"
Expand Down
15 changes: 15 additions & 0 deletions knime_extension/src/geospatial_ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,21 @@ def __initialize_pyproj():
__initialize_pyproj()


def __initialize_gdal():
"""
Set GDAL_DATA environment variable to avoid rasterio warnings
"""
import os.path as os

gdal_path = os.join(knut.get_env_path(), "Library\share\gdal")
if os.exists(gdal_path):
import os as os_env

os_env.environ["GDAL_DATA"] = gdal_path


__initialize_gdal()

# Fake the libpysal.examples import to prevent it from downloading data from the internet which might cause problems
# in environments without internet access: https://github.com/spatial-data-lab/knime-geospatial-extension/issues/165
# class __LibpysalExamplesModuleMock:
Expand Down
66 changes: 58 additions & 8 deletions knime_extension/src/nodes/visualize.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,30 @@ class BaseMapSettings:
)


@knext.parameter_group(label="Base Map (contextily)")
class StaticBaseMapCxSettings:
"""Contextily-only base map setting for the static matplotlib view."""

base_map = knext.StringParameter(
"Base map",
"Select a contextily base map to render as background. Set to 'Don't show base map' to disable.",
default_value="Don't show base map",
enum=[
"Don't show base map",
"OpenStreetMap",
"CartoDB Positron",
"CartoDB DarkMatter",
"Esri WorldImagery",
"Esri WorldStreetMap",
"Esri WorldTopoMap",
"Esri WorldTerrain",
"Esri WorldGrayCanvas",
"Stamen Watercolor",
],
since_version="2.0.0",
)


@knext.node(
name="Geospatial View",
node_type=knext.NodeType.VISUALIZER,
Expand Down Expand Up @@ -988,6 +1012,9 @@ class ViewNodeStatic:

legend_settings = StaticLegendSettings()

# Contextily-only basemap settings for static view (advanced, default off)
basemap_cx_settings = StaticBaseMapCxSettings()

def configure(self, configure_context, input_schema):
self.geo_col = knut.column_exists_or_preset(
configure_context, self.geo_col, input_schema, knut.is_geo
Expand Down Expand Up @@ -1117,17 +1144,40 @@ def execute(self, exec_context: knext.ExecutionContext, input_table):
map.set_title(self.figure_title, fontsize=self.figure_title_size)
if self.set_axis_off:
map.set_axis_off()
# knut.check_canceled(exec_context)
# cx.add_basemap(map, crs=gdf.crs.to_string(), source=cx.providers.flatten()[self.base_map])

# create the output image
import io
# Add contextily basemap if selected (contextily-only options)
if self.basemap_cx_settings.base_map != "Don't show base map":
import contextily as cx

label = self.basemap_cx_settings.base_map
if label == "OpenStreetMap":
source = cx.providers.OpenStreetMap.Mapnik
elif label == "CartoDB Positron":
source = cx.providers.CartoDB.Positron
elif label == "CartoDB DarkMatter":
source = cx.providers.CartoDB.DarkMatter
elif label == "Esri WorldImagery":
source = cx.providers.Esri.WorldImagery
elif label == "Esri WorldStreetMap":
source = cx.providers.Esri.WorldStreetMap
elif label == "Esri WorldTopoMap":
source = cx.providers.Esri.WorldTopoMap
elif label == "Esri WorldTerrain":
source = cx.providers.Esri.WorldTerrain
elif label == "Esri WorldGrayCanvas":
source = cx.providers.Esri.WorldGrayCanvas
elif label == "Stamen Watercolor":
source = cx.providers.Stamen.Watercolor
else:
source = cx.providers.OpenStreetMap.Mapnik

fig = map.get_figure()
out_image_buffer = io.BytesIO()
fig.savefig(out_image_buffer, format=self.image_type.lower())
if gdf.crs is not None:
cx.add_basemap(map, source=source, crs=gdf.crs.to_string())

return (out_image_buffer.getvalue(), knext.view_matplotlib(fig))
# create the output image
view = knext.view_matplotlib(map.get_figure(), self.image_type.lower())
output_image = view.render()
return output_image, view


############################################
Expand Down