diff --git a/packages/geojson-extension/src/index.tsx b/packages/geojson-extension/src/index.tsx
index 918c318ad..a77014f79 100644
--- a/packages/geojson-extension/src/index.tsx
+++ b/packages/geojson-extension/src/index.tsx
@@ -70,9 +70,20 @@ const URL_TEMPLATE: string = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png
const LAYER_OPTIONS: leaflet.TileLayerOptions = {
attribution: 'Map data (c) OpenStreetMap contributors',
minZoom: 0,
- maxZoom: 18
+ maxZoom: 20
};
+class FitToBounds extends leaflet.Control {
+ _img: HTMLImageElement;
+ delegate: RenderedGeoJSON;
+ onAdd(map: leaflet.Map): HTMLElement {
+ this._img = leaflet.DomUtil.create('img') as HTMLImageElement;
+ this._img.className = 'jp-ZoomToBoundsIcon';
+ this._img.style.width = '40px';
+ this._img.onclick = this.delegate.fitToBounds.bind(this.delegate);
+ return this._img;
+ };
+};
export
class RenderedGeoJSON extends Widget implements IRenderMime.IRenderer {
@@ -90,6 +101,9 @@ class RenderedGeoJSON extends Widget implements IRenderMime.IRenderer {
this._map = leaflet.map(this.node, {
trackResize: false
});
+ let ftb_control = new FitToBounds();
+ ftb_control.delegate = this;
+ ftb_control.addTo(this._map);
}
/**
@@ -120,7 +134,12 @@ class RenderedGeoJSON extends Widget implements IRenderMime.IRenderer {
resolve();
});
}
-
+
+
+ fitToBounds(): void {
+ // Update map size after panel/window is resized
+ this._map.fitBounds(this._geoJSONLayer.getBounds());
+ }
/**
* A message handler invoked on an `'after-attach'` message.
*/
@@ -137,6 +156,7 @@ class RenderedGeoJSON extends Widget implements IRenderMime.IRenderer {
this._map.scrollWheelZoom.enable();
});
}
+ this.fitToBounds();
this.update();
}
@@ -144,6 +164,7 @@ class RenderedGeoJSON extends Widget implements IRenderMime.IRenderer {
* A message handler invoked on an `'after-show'` message.
*/
protected onAfterShow(msg: Message): void {
+ this.fitToBounds();
this.update();
}
@@ -160,8 +181,6 @@ class RenderedGeoJSON extends Widget implements IRenderMime.IRenderer {
protected onUpdateRequest(msg: Message): void {
// Update map size after update
if (this.isVisible) this._map.invalidateSize();
- // Update map size after panel/window is resized
- this._map.fitBounds(this._geoJSONLayer.getBounds());
}
private _map: leaflet.Map;
diff --git a/packages/geojson-extension/style/index.css b/packages/geojson-extension/style/index.css
index cf35e5d25..54b28c05c 100644
--- a/packages/geojson-extension/style/index.css
+++ b/packages/geojson-extension/style/index.css
@@ -6,6 +6,7 @@
/* Add CSS variables to :root */
:root {
--jp-icon-geojson: url('./geojson.svg');
+ --jp-icon-zoom-to-bounds: url('./zoom_to_bounds.svg');
}
/* Base styles */
@@ -30,3 +31,8 @@
.jp-GeoJSONIcon {
background-image: var(--jp-icon-geojson);
}
+
+/* Zoom to bounds icon */
+.jp-ZoomToBoundsIcon {
+ content: var(--jp-icon-zoom-to-bounds);
+}
diff --git a/packages/geojson-extension/style/zoom_to_bounds.svg b/packages/geojson-extension/style/zoom_to_bounds.svg
new file mode 100644
index 000000000..44a80b1a3
--- /dev/null
+++ b/packages/geojson-extension/style/zoom_to_bounds.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file