Skip to content

Commit 873ac56

Browse files
Merge pull request #361 from OpenSPP/improve-base-gis
improved base GIS by adding image raster layer; fixed issue when ther…
2 parents 2da47bf + d09c27d commit 873ac56

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

spp_base_gis/models/raster_layer.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class OpenSPPGisRasterLayer(models.Model):
88
RASTER_TYPE_CHOICES = [
99
("d_wms", "Distant WMS"),
1010
("osm", "OpenStreetMap"),
11+
("image", "Image"),
1112
]
1213

1314
RASTER_STYLE_CHOICES = [
@@ -58,12 +59,12 @@ class OpenSPPGisRasterLayer(models.Model):
5859
required=True,
5960
)
6061
name = fields.Char("Layer Name", translate=True, required=True)
61-
url = fields.Char("Service URL")
6262

6363
# technical field to display or not wms options
6464
is_wms = fields.Boolean(compute="_compute_is_wms")
6565

6666
# wms options
67+
url = fields.Char("Service URL")
6768
wms_layer_name = fields.Char("WMS Layer Name")
6869
opacity = fields.Float(default=1.0)
6970

@@ -72,12 +73,21 @@ class OpenSPPGisRasterLayer(models.Model):
7273
RASTER_STYLE_CHOICES,
7374
default="streets",
7475
)
76+
visible_on_load = fields.Boolean("Is visible on load?", default=True)
77+
78+
# image options
79+
image_url = fields.Char()
80+
image_opacity = fields.Float(default=1.0)
81+
x_min = fields.Float(digits=(3, 15))
82+
x_max = fields.Float(digits=(3, 15))
83+
y_min = fields.Float(digits=(3, 15))
84+
y_max = fields.Float(digits=(3, 15))
85+
7586
view_id = fields.Many2one("ir.ui.view", "Related View", domain=[("type", "=", "gis")], required=True)
7687

7788
type_id = fields.Many2one("spp.gis.raster.layer.type", "Layer", domain="[('service', '=', raster_type)]")
7889
type = fields.Char(related="type_id.code")
7990
sequence = fields.Integer("Layer priority", default=6)
80-
visible_on_load = fields.Boolean("Is visible on load?", default=True)
8191

8292
@api.depends("raster_type")
8393
def _compute_is_wms(self):

spp_base_gis/static/src/js/views/gis/gis_renderer/gis_renderer.esm.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ export class GisRenderer extends Component {
134134
this.createWMSRasterSource(rasterLayerSourceId, layer);
135135
this.createWMSRasterLayer(rasterLayerSourceId, layer);
136136
}
137+
if (layer.raster_type === "image") {
138+
const sourceId = `image_${layer.id}`;
139+
this.createImageRasterSource(sourceId, layer);
140+
this.createImageRasterLayer(sourceId, layer);
141+
}
137142
if (layer.raster_type === "osm" && layer.isVisible) {
138143
this.defaultRaster = layer;
139144
}
@@ -261,6 +266,38 @@ export class GisRenderer extends Component {
261266
});
262267
}
263268

269+
createImageRasterSource(sourceId, layer) {
270+
this.sources.push([
271+
sourceId,
272+
{
273+
type: "image",
274+
url: layer.image_url,
275+
coordinates: [
276+
[layer.x_min, layer.y_max], // Top-left
277+
[layer.x_max, layer.y_max], // Top-right
278+
[layer.x_max, layer.y_min], // Bottom-right
279+
[layer.x_min, layer.y_min], // Bottom-left
280+
],
281+
},
282+
]);
283+
}
284+
285+
createImageRasterLayer(sourceId, layer) {
286+
const opacity = Math.min(1, Math.max(0, layer.image_opacity));
287+
288+
this.layers.push({
289+
type: "raster",
290+
id: sourceId,
291+
source: sourceId,
292+
paint: {
293+
"raster-opacity": opacity,
294+
},
295+
layout: {
296+
visibility: layer.isVisible ? "visible" : "none",
297+
},
298+
});
299+
}
300+
264301
createDefaultDataSource(features) {
265302
this.sources.push([
266303
this.sourceId,
@@ -437,6 +474,25 @@ export class GisRenderer extends Component {
437474

438475
this.map.setLayoutProperty(rasterLayerSourceId, "visibility", visibility);
439476
this.map.setPaintProperty(rasterLayerSourceId, "raster-opacity", opacity);
477+
} else if (layer.raster_type === "image") {
478+
const sourceId = `image_${layer.id}`;
479+
const visibility = layer.isVisible ? "visible" : "none";
480+
const opacity = Math.min(1, Math.max(0, layer.image_opacity));
481+
482+
const source = this.map.getSource(sourceId);
483+
if (source) {
484+
source.updateImage({
485+
url: layer.image_url,
486+
coordinates: [
487+
[layer.x_min, layer.y_max], // Top-left
488+
[layer.x_max, layer.y_max], // Top-right
489+
[layer.x_max, layer.y_min], // Bottom-right
490+
[layer.x_min, layer.y_min], // Bottom-left
491+
],
492+
});
493+
this.map.setLayoutProperty(sourceId, "visibility", visibility);
494+
this.map.setPaintProperty(sourceId, "raster-opacity", opacity);
495+
}
440496
} else if (layer.raster_type === "osm" && layer.isVisible) {
441497
this.map.setStyle(this.getMapStyle(layer));
442498
}

spp_base_gis/static/src/js/views/gis/layers_panel/layers_panel.esm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class LayersPanel extends Component {
6161

6262
async loadLayers() {
6363
try {
64-
const result = await this.orm.call(this.props.model, "get_gis_layers", []);
64+
const result = await this.orm.call(this.props.model, "get_gis_layers", [this.env.config.viewId]);
6565
this.state.gisLayers = result;
6666
} catch (error) {
6767
console.error("Error loading layers:", error);

spp_base_gis/views/raster_layer_view.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
<field name="raster_style" required="raster_type == 'osm'" />
2424
<field name="visible_on_load" />
2525
</group>
26+
<group string="Image options" invisible="raster_type != 'image'" colspan="4">
27+
<field name="image_url" required="raster_type == 'image'" />
28+
<field name="image_opacity" required="raster_type == 'image'" />
29+
<field name="x_min" required="raster_type == 'image'" />
30+
<field name="x_max" required="raster_type == 'image'" />
31+
<field name="y_min" required="raster_type == 'image'" />
32+
<field name="y_max" required="raster_type == 'image'" />
33+
</group>
2634
</sheet>
2735
</form>
2836
</field>

0 commit comments

Comments
 (0)