Skip to content

Commit

Permalink
Merge pull request #25 from pblottiere/get_style_raster
Browse files Browse the repository at this point in the history
Fix get style for raster (and homogenize vector style)
  • Loading branch information
pblottiere authored Jun 10, 2024
2 parents a1e77d4 + 2f03fb3 commit e15daa1
Show file tree
Hide file tree
Showing 11 changed files with 446 additions and 260 deletions.
12 changes: 9 additions & 3 deletions docs/src/qsa-api/endpoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,19 @@ $ curl "http://localhost:5000/api/symbology/vector/polygon/single_symbol/fill/pr
$ curl "http://localhost:5000/api/symbology/raster/multibandcolor/properties" | jq
{
"blue": {
"band": 3
"band": 3,
"min": 0.0,
"max": 1.0
},
"green": {
"band": 2
"band": 2,
"min": 0.0,
"max": 1.0
},
"red": {
"band": 1
"band": 1,
"min": 0.0,
"max": 1.0
}
"contrast_enhancement": {
"algorithm": "StretchToMinimumMaximum (StretchToMinimumMaximum, NoEnhancement)",
Expand Down
2 changes: 1 addition & 1 deletion docs/src/sandbox/raster/styles.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ $ curl "http://localhost:5000/api/projects/my_project/styles?schema=my_schema" \
"symbology": {
"type": "singlebandgray",
"properties": {
"gray_band": 1
"gray_band": 1,
"contrast_enhancement": {
"algorithm": "StretchToMinimumMaximum",
"limits_min_max": "MinMax"
Expand Down
9 changes: 6 additions & 3 deletions qsa-api/qsa_api/api/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def project_add():
return {"error": "Project already exists"}
rc, err = project.create(author)
if not rc:
return {"error": err}
return {"error": err}, 415
return jsonify(True), 201
return {"error": "Request must be JSON"}, 415

Expand Down Expand Up @@ -94,8 +94,11 @@ def project_style(name, style):
psql_schema = request.args.get("schema", default="public")
project = QSAProject(name, psql_schema)
if project.exists():
infos = project.style(style)
return jsonify(infos), 201
infos, err = project.style(style)
if err:
return {"error": err}, 415
else:
return jsonify(infos), 201
else:
return {"error": "Project does not exist"}, 415

Expand Down
40 changes: 10 additions & 30 deletions qsa-api/qsa_api/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,18 @@
QgsVectorLayer,
QgsRasterLayer,
QgsMarkerSymbol,
QgsFeatureRenderer,
QgsReadWriteContext,
QgsRasterMinMaxOrigin,
QgsContrastEnhancement,
QgsSingleSymbolRenderer,
QgsSimpleFillSymbolLayer,
QgsSimpleLineSymbolLayer,
QgsSimpleMarkerSymbolLayer,
)
from qgis.PyQt.QtXml import QDomDocument, QDomNode

from .mapproxy import QSAMapProxy
from .utils import RasterSymbologyRenderer, StorageBackend, config
from .utils import StorageBackend, config
from .raster import RasterSymbologyRenderer
from .vector import VectorSymbologyRenderer


RENDERER_TAG_NAME = "renderer-v2" # constant from core/symbology/renderer.h
Expand Down Expand Up @@ -129,35 +128,16 @@ def style_default(self, geometry: str) -> bool:
con.close()
return default_style

def style(self, name: str) -> dict:
def style(self, name: str) -> (dict, str):
if name not in self.styles:
return {}
return {}, "Invalid style"

path = self._qgis_project_dir / f"{name}.qml"
doc = QDomDocument()
doc.setContent(open(path.as_posix()).read())
node = QDomNode(doc.firstChild())

renderer_node = node.firstChildElement(RENDERER_TAG_NAME)
renderer = QgsFeatureRenderer.load(
renderer_node, QgsReadWriteContext()
)
symbol = renderer.symbol()
props = symbol.symbolLayer(0).properties()

geom = "line"
symbol = QgsSymbol.symbolTypeToString(symbol.type()).lower()
if symbol == "fill":
geom = "polygon"

m = {}
m["symbology"] = "single_symbol"
m["name"] = name
m["symbol"] = symbol
m["geometry"] = geom
m["properties"] = props

return m
if VectorSymbologyRenderer.style_is_vector(path):
return VectorSymbologyRenderer.style_to_json(path)
else:
return RasterSymbologyRenderer.style_to_json(path)

def style_update(self, geometry: str, style: str) -> None:
con = sqlite3.connect(self.sqlite_db.as_posix())
Expand Down Expand Up @@ -415,7 +395,7 @@ def _add_style_raster(
return False, "`properties` is missing in `symbology`"

# init renderer
tif = Path(__file__).resolve().parent / "empty.tif"
tif = Path(__file__).resolve().parent / "raster" / "empty.tif"
rl = QgsRasterLayer(tif.as_posix(), "", "gdal")

# symbology
Expand Down
3 changes: 3 additions & 0 deletions qsa-api/qsa_api/raster/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# coding: utf8

from .renderer import RasterSymbologyRenderer
File renamed without changes.
Loading

0 comments on commit e15daa1

Please sign in to comment.