Skip to content

Interface

dispatcher

RedisQueue

Source code in src/qgis_server_light/interface/dispatcher.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class RedisQueue:
    def __init__(self, url: str) -> None:
        self.pool = redis.BlockingConnectionPool.from_url(url)

    async def post(
            self,
            job: QslGetMapJob | QslGetFeatureInfoJob | QslLegendJob,
            timeout: float = 10
    ) -> JobResult:
        """
        Posts a new `job` to the job queue and waits maximum `timeout` seconds to complete.
        Will return a JobResult if successful or raise an error.
        """
        r = await redis.Redis(connection_pool=self.pool)
        job_id = str(uuid4())
        creation_time = datetime.datetime.now().isoformat()
        datetime.datetime.now()
        if isinstance(job, QslGetMapJob):
            job = JobRunnerInfoQslGetMapJob(
                id=job_id,
                type=JobRunnerInfoQslGetMapJob.__name__,
                job=job
            )
        elif isinstance(job, QslGetFeatureInfoJob):
            job = JobRunnerInfoQslGetFeatureInfoJob(
                id=job_id,
                type=JobRunnerInfoQslGetFeatureInfoJob.__name__,
                job=job
            )
        elif isinstance(job, QslLegendJob):
            job = JobRunnerInfoQslLegendJob(
                id=job_id,
                type=JobRunnerInfoQslLegendJob.__name__,
                job=job
            )
        async with r.pipeline() as p:
            logging.info(f"{job_id} pushed")
            p.rpush("jobs", JsonSerializer().render(job))
            p.hset(job_id, "status", "queued")
            p.hset(job_id, "timestamp", creation_time)
            await p.execute()

            async with r.pubsub() as ps:
                await ps.subscribe(f"notifications:{job_id}")
                try:
                    async with async_timeout.timeout(timeout):
                        while True:
                            message = await ps.get_message(
                                timeout=timeout, ignore_subscribe_messages=True
                            )
                            if not message:
                                continue  # https://github.com/redis/redis-py/issues/733
                            # TODO: handle errors
                            logging.info(f"{job_id} succeeded")
                            result = pickle.loads(message["data"])
                            await asyncio.create_task(r.delete(job_id))
                            return result
                except (asyncio.TimeoutError, asyncio.exceptions.CancelledError) as err:
                    logging.info(f"{job_id} timeout")
                    await r.delete(job_id)
                    raise

pool = redis.BlockingConnectionPool.from_url(url) instance-attribute

__init__(url)

Source code in src/qgis_server_light/interface/dispatcher.py
15
16
def __init__(self, url: str) -> None:
    self.pool = redis.BlockingConnectionPool.from_url(url)

post(job, timeout=10) async

Posts a new job to the job queue and waits maximum timeout seconds to complete. Will return a JobResult if successful or raise an error.

Source code in src/qgis_server_light/interface/dispatcher.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
async def post(
        self,
        job: QslGetMapJob | QslGetFeatureInfoJob | QslLegendJob,
        timeout: float = 10
) -> JobResult:
    """
    Posts a new `job` to the job queue and waits maximum `timeout` seconds to complete.
    Will return a JobResult if successful or raise an error.
    """
    r = await redis.Redis(connection_pool=self.pool)
    job_id = str(uuid4())
    creation_time = datetime.datetime.now().isoformat()
    datetime.datetime.now()
    if isinstance(job, QslGetMapJob):
        job = JobRunnerInfoQslGetMapJob(
            id=job_id,
            type=JobRunnerInfoQslGetMapJob.__name__,
            job=job
        )
    elif isinstance(job, QslGetFeatureInfoJob):
        job = JobRunnerInfoQslGetFeatureInfoJob(
            id=job_id,
            type=JobRunnerInfoQslGetFeatureInfoJob.__name__,
            job=job
        )
    elif isinstance(job, QslLegendJob):
        job = JobRunnerInfoQslLegendJob(
            id=job_id,
            type=JobRunnerInfoQslLegendJob.__name__,
            job=job
        )
    async with r.pipeline() as p:
        logging.info(f"{job_id} pushed")
        p.rpush("jobs", JsonSerializer().render(job))
        p.hset(job_id, "status", "queued")
        p.hset(job_id, "timestamp", creation_time)
        await p.execute()

        async with r.pubsub() as ps:
            await ps.subscribe(f"notifications:{job_id}")
            try:
                async with async_timeout.timeout(timeout):
                    while True:
                        message = await ps.get_message(
                            timeout=timeout, ignore_subscribe_messages=True
                        )
                        if not message:
                            continue  # https://github.com/redis/redis-py/issues/733
                        # TODO: handle errors
                        logging.info(f"{job_id} succeeded")
                        result = pickle.loads(message["data"])
                        await asyncio.create_task(r.delete(job_id))
                        return result
            except (asyncio.TimeoutError, asyncio.exceptions.CancelledError) as err:
                logging.info(f"{job_id} timeout")
                await r.delete(job_id)
                raise

job

log = logging.getLogger(__name__) module-attribute

AbstractJobRunnerInfo dataclass

Source code in src/qgis_server_light/interface/job.py
156
157
158
159
@dataclass
class AbstractJobRunnerInfo:
    id: str = field(metadata={"type": "Element", "required": True})
    type: str = field(metadata={"type": "Element", "required": True})

id: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

type: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(id, type)

AbstractWmsParams dataclass

Source code in src/qgis_server_light/interface/job.py
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@dataclass
class AbstractWmsParams:
    BBOX: str = field(metadata={"type": "Element", "required": True})
    CRS: str = field(metadata={"type": "Element", "required": True})
    WIDTH: str = field(metadata={"type": "Element", "required": True})
    HEIGHT: str = field(metadata={"type": "Element", "required": True})
    # optional parameters
    DPI: str = field(default=None, metadata={"type": "Element", "required": False})
    FORMAT_OPTIONS: str = field(
        default=None, metadata={"type": "Element", "required": False}
    )
    STYLES: str = field(
        default_factory=list, metadata={"type": "Element", "required": False}
    )

    @property
    def dpi(self) -> int | None:
        if self.DPI is not None:
            return int(self.DPI)
        elif self.FORMAT_OPTIONS is not None:
            return int(self.FORMAT_OPTIONS.split(":")[-1])
        else:
            return None

    @property
    def bbox(self) -> List[str]:
        return self.BBOX.split(",")

    @classmethod
    def from_overloaded_dict(cls, params: dict):
        return cls(
            **{
                k: v
                for k, v in params.items()
                if k in inspect.signature(cls).parameters
            }
        )

BBOX: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

CRS: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

DPI: str = field(default=None, metadata={'type': 'Element', 'required': False}) class-attribute instance-attribute

FORMAT_OPTIONS: str = field(default=None, metadata={'type': 'Element', 'required': False}) class-attribute instance-attribute

HEIGHT: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

STYLES: str = field(default_factory=list, metadata={'type': 'Element', 'required': False}) class-attribute instance-attribute

WIDTH: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

bbox: List[str] property

dpi: int | None property

__init__(BBOX, CRS, WIDTH, HEIGHT, DPI=None, FORMAT_OPTIONS=None, STYLES=list())

from_overloaded_dict(params) classmethod

Source code in src/qgis_server_light/interface/job.py
44
45
46
47
48
49
50
51
52
@classmethod
def from_overloaded_dict(cls, params: dict):
    return cls(
        **{
            k: v
            for k, v in params.items()
            if k in inspect.signature(cls).parameters
        }
    )

JobResult dataclass

Source code in src/qgis_server_light/interface/job.py
150
151
152
153
@dataclass
class JobResult:
    data: Any = field(metadata={"type": "Element", "required": True})
    content_type: str = field(metadata={"type": "Element", "required": True})

content_type: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

data: Any = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(data, content_type)

JobRunnerInfoQslGetFeatureInfoJob dataclass

Bases: AbstractJobRunnerInfo

Source code in src/qgis_server_light/interface/job.py
167
168
169
@dataclass
class JobRunnerInfoQslGetFeatureInfoJob(AbstractJobRunnerInfo):
    job: QslGetFeatureInfoJob = field(metadata={"type": "Element", "required": True})

job: QslGetFeatureInfoJob = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(id, type, job)

JobRunnerInfoQslGetMapJob dataclass

Bases: AbstractJobRunnerInfo

Source code in src/qgis_server_light/interface/job.py
162
163
164
@dataclass
class JobRunnerInfoQslGetMapJob(AbstractJobRunnerInfo):
    job: QslGetMapJob = field(metadata={"type": "Element", "required": True})

job: QslGetMapJob = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(id, type, job)

JobRunnerInfoQslLegendJob dataclass

Bases: AbstractJobRunnerInfo

Source code in src/qgis_server_light/interface/job.py
172
173
174
@dataclass
class JobRunnerInfoQslLegendJob(AbstractJobRunnerInfo):
    job: QslLegendJob = field(metadata={"type": "Element", "required": True})

job: QslLegendJob = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(id, type, job)

QslAbstractJob dataclass

Source code in src/qgis_server_light/interface/job.py
104
105
106
107
108
@dataclass
class QslAbstractJob:
    svg_paths: List[str] = field(
        default_factory=list, metadata={"type": "Element", "required": True}
    )

svg_paths: List[str] = field(default_factory=list, metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(svg_paths=list())

QslGetFeatureInfoJob dataclass

Bases: QslAbstractJob

A job to extract feature info

Source code in src/qgis_server_light/interface/job.py
136
137
138
139
140
141
142
@dataclass(kw_only=True)
class QslGetFeatureInfoJob(QslAbstractJob):
    """A job to extract feature info"""

    service_params: WmsGetFeatureInfoParams = field(
        metadata={"type": "Element", "required": True}
    )

service_params: WmsGetFeatureInfoParams = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(svg_paths=list(), *, service_params)

QslGetMapJob dataclass

Bases: QslAbstractJob

A job to be rendered as an image

Source code in src/qgis_server_light/interface/job.py
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
@dataclass(kw_only=True)
class QslGetMapJob(QslAbstractJob):
    """A job to be rendered as an image"""

    service_params: WmsGetMapParams = field(
        metadata={"type": "Element", "required": True}
    )

    raster_layers: List[Raster] = field(metadata={"type": "Element", "required": True})

    vector_layers: List[Vector] = field(metadata={"type": "Element", "required": True})

    custom_layers: List[Custom] = field(metadata={"type": "Element", "required": True})

    extent_buffer: Optional[float] = field(
        default=0.0, metadata={"type": "Element", "required": False}
    )

    def get_layer_by_name(self, name: str) -> Raster | Vector | Custom:
        for layer in self.raster_layers + self.vector_layers + self.custom_layers:
            if layer.name == name:
                return layer
        raise AttributeError(f'No layer with name "{name} was found."')

custom_layers: List[Custom] = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

extent_buffer: Optional[float] = field(default=0.0, metadata={'type': 'Element', 'required': False}) class-attribute instance-attribute

raster_layers: List[Raster] = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

service_params: WmsGetMapParams = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

vector_layers: List[Vector] = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(svg_paths=list(), *, service_params, raster_layers, vector_layers, custom_layers, extent_buffer=0.0)

get_layer_by_name(name)

Source code in src/qgis_server_light/interface/job.py
129
130
131
132
133
def get_layer_by_name(self, name: str) -> Raster | Vector | Custom:
    for layer in self.raster_layers + self.vector_layers + self.custom_layers:
        if layer.name == name:
            return layer
    raise AttributeError(f'No layer with name "{name} was found."')

QslLegendJob dataclass

Bases: QslAbstractJob

Render legend

Source code in src/qgis_server_light/interface/job.py
145
146
147
@dataclass(kw_only=True)
class QslLegendJob(QslAbstractJob):
    """Render legend"""

__init__(svg_paths=list())

WmsGetFeatureInfoParams dataclass

Bases: AbstractWmsParams

Source code in src/qgis_server_light/interface/job.py
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
class WmsGetFeatureInfoParams(AbstractWmsParams):
    X: str = field(default=None, metadata={"type": "Element", "required": True})
    Y: str = field(default=None, metadata={"type": "Element", "required": True})
    I: str = field(default=None, metadata={"type": "Element", "required": True})
    J: str = field(default=None, metadata={"type": "Element", "required": True})
    INFO_FORMAT: str = field(metadata={"type": "Element", "required": True})

    # mime type, only application/json supported
    QUERY_LAYERS: str = field(metadata={"type": "Element", "required": True})

    def __post_init__(self):
        x = int(self.I or self.X)
        y = int(self.J or self.Y)
        if x is None or y is None:
            raise KeyError(
                "Parameter `I` or `X` and `J` or `Y`  are mandatory for GetFeatureInfo"
            )
        if self.QUERY_LAYERS is None:
            raise KeyError("QUERY_LAYERS is mandatory in this request")

    @property
    def x(self) -> int:
        return int(self.I or self.X)

    @property
    def y(self) -> int:
        return int(self.J or self.Y)

    @property
    def query_layers(self):
        return self.QUERY_LAYERS.split(",")

I: str = field(default=None, metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

INFO_FORMAT: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

J: str = field(default=None, metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

QUERY_LAYERS: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

X: str = field(default=None, metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

Y: str = field(default=None, metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

query_layers property

x: int property

y: int property

__post_init__()

Source code in src/qgis_server_light/interface/job.py
81
82
83
84
85
86
87
88
89
def __post_init__(self):
    x = int(self.I or self.X)
    y = int(self.J or self.Y)
    if x is None or y is None:
        raise KeyError(
            "Parameter `I` or `X` and `J` or `Y`  are mandatory for GetFeatureInfo"
        )
    if self.QUERY_LAYERS is None:
        raise KeyError("QUERY_LAYERS is mandatory in this request")

WmsGetMapParams dataclass

Bases: AbstractWmsParams

Represents query parameters from the original WMS request

Source code in src/qgis_server_light/interface/job.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
@dataclass(kw_only=True)
class WmsGetMapParams(AbstractWmsParams):
    """Represents query parameters from the original WMS request"""

    LAYERS: str = field(metadata={"type": "Element", "required": True})

    # mime type of the requested image
    FORMAT: str = field(
        default="image/png", metadata={"type": "Element", "required": True}
    )

    @property
    def layers(self) -> List[str]:
        return self.LAYERS.split(",")

FORMAT: str = field(default='image/png', metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

LAYERS: str = field(metadata={'type': 'Element', 'required': True}) class-attribute instance-attribute

layers: List[str] property

__init__(BBOX, CRS, WIDTH, HEIGHT, DPI=None, FORMAT_OPTIONS=None, STYLES=list(), *, LAYERS, FORMAT='image/png')

qgis

AbstractDataset dataclass

Bases: LayerLike

Source code in src/qgis_server_light/interface/qgis.py
83
84
85
@dataclass
class AbstractDataset(LayerLike):
    title: str = field(metadata={"name": "Title", "type": "Element", "required": True})

title: str = field(metadata={'name': 'Title', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(name, title)

BBox dataclass

Source code in src/qgis_server_light/interface/qgis.py
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@dataclass
class BBox:
    x_min: float = field(metadata={"name": "XMin", "type": "Element", "required": True})
    x_max: float = field(metadata={"name": "XMax", "type": "Element", "required": True})
    y_min: float = field(metadata={"name": "YMin", "type": "Element", "required": True})
    y_max: float = field(metadata={"name": "YMax", "type": "Element", "required": True})
    z_min: Optional[float] = field(
        default=0.0, metadata={"name": "ZMin", "type": "Element", "required": False}
    )
    z_max: Optional[float] = field(
        default=0.0, metadata={"name": "ZMax", "type": "Element", "required": False}
    )

    def to_list(self) -> list:
        return [self.x_min, self.y_min, self.z_min, self.x_max, self.y_max, self.z_max]

    def to_string(self) -> str:
        return ",".join([str(item) for item in self.to_list()])

    @staticmethod
    def from_string(bbox_string: str) -> "BBox":
        """
        Takes a CSV string representation of a BBox in the form:
            '<x_min>,<y_min>,<z_min>,<x_max>,<y_max>,<z_max>'
        """
        coordinates = bbox_string.split(",")
        return BBox(
            x_min=float(coordinates[0]),
            y_min=float(coordinates[1]),
            z_min=float(coordinates[2]),
            x_max=float(coordinates[3]),
            y_max=float(coordinates[4]),
            z_max=float(coordinates[5]),
        )

    @staticmethod
    def from_list(bbox_list: List[float]) -> "BBox":
        """
        Takes a list representation of a BBox in the form:
            [<x_min>,<y_min>,<z_min>,<x_max>,<y_max>,<z_max>]
        """
        return BBox(
            x_min=bbox_list[0],
            y_min=bbox_list[1],
            z_min=bbox_list[2],
            x_max=bbox_list[3],
            y_max=bbox_list[4],
            z_max=bbox_list[5],
        )

x_max: float = field(metadata={'name': 'XMax', 'type': 'Element', 'required': True}) class-attribute instance-attribute

x_min: float = field(metadata={'name': 'XMin', 'type': 'Element', 'required': True}) class-attribute instance-attribute

y_max: float = field(metadata={'name': 'YMax', 'type': 'Element', 'required': True}) class-attribute instance-attribute

y_min: float = field(metadata={'name': 'YMin', 'type': 'Element', 'required': True}) class-attribute instance-attribute

z_max: Optional[float] = field(default=0.0, metadata={'name': 'ZMax', 'type': 'Element', 'required': False}) class-attribute instance-attribute

z_min: Optional[float] = field(default=0.0, metadata={'name': 'ZMin', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(x_min, x_max, y_min, y_max, z_min=0.0, z_max=0.0)

from_list(bbox_list) staticmethod

Takes a list representation of a BBox in the form

[,,,,,]

Source code in src/qgis_server_light/interface/qgis.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@staticmethod
def from_list(bbox_list: List[float]) -> "BBox":
    """
    Takes a list representation of a BBox in the form:
        [<x_min>,<y_min>,<z_min>,<x_max>,<y_max>,<z_max>]
    """
    return BBox(
        x_min=bbox_list[0],
        y_min=bbox_list[1],
        z_min=bbox_list[2],
        x_max=bbox_list[3],
        y_max=bbox_list[4],
        z_max=bbox_list[5],
    )

from_string(bbox_string) staticmethod

Takes a CSV string representation of a BBox in the form

',,,,,'

Source code in src/qgis_server_light/interface/qgis.py
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@staticmethod
def from_string(bbox_string: str) -> "BBox":
    """
    Takes a CSV string representation of a BBox in the form:
        '<x_min>,<y_min>,<z_min>,<x_max>,<y_max>,<z_max>'
    """
    coordinates = bbox_string.split(",")
    return BBox(
        x_min=float(coordinates[0]),
        y_min=float(coordinates[1]),
        z_min=float(coordinates[2]),
        x_max=float(coordinates[3]),
        y_max=float(coordinates[4]),
        z_max=float(coordinates[5]),
    )

to_list()

Source code in src/qgis_server_light/interface/qgis.py
21
22
def to_list(self) -> list:
    return [self.x_min, self.y_min, self.z_min, self.x_max, self.y_max, self.z_max]

to_string()

Source code in src/qgis_server_light/interface/qgis.py
24
25
def to_string(self) -> str:
    return ",".join([str(item) for item in self.to_list()])

Config dataclass

Source code in src/qgis_server_light/interface/qgis.py
424
425
426
427
428
429
430
431
432
433
@dataclass
class Config:
    project: Project = field(
        metadata={"name": "Project", "type": "Element", "required": True}
    )
    meta_data: MetaData = field(
        metadata={"name": "MetaData", "type": "Element", "required": True}
    )
    tree: Tree = field(metadata={"name": "Tree", "type": "Element"})
    datasets: Datasets = field(metadata={"name": "DataSet", "type": "Element"})

datasets: Datasets = field(metadata={'name': 'DataSet', 'type': 'Element'}) class-attribute instance-attribute

meta_data: MetaData = field(metadata={'name': 'MetaData', 'type': 'Element', 'required': True}) class-attribute instance-attribute

project: Project = field(metadata={'name': 'Project', 'type': 'Element', 'required': True}) class-attribute instance-attribute

tree: Tree = field(metadata={'name': 'Tree', 'type': 'Element'}) class-attribute instance-attribute

__init__(project, meta_data, tree, datasets)

Contact dataclass

Source code in src/qgis_server_light/interface/qgis.py
303
304
305
306
307
308
309
310
@dataclass
class Contact:
    mail: str
    organization: str
    person: str
    phone: str
    position: str
    url: str

mail: str instance-attribute

organization: str instance-attribute

person: str instance-attribute

phone: str instance-attribute

position: str instance-attribute

url: str instance-attribute

__init__(mail, organization, person, phone, position, url)

Crs dataclass

Source code in src/qgis_server_light/interface/qgis.py
203
204
205
206
207
208
209
210
211
212
213
214
@dataclass
class Crs:
    auth_id: str = field(
        default=None, metadata={"name": "AuthId", "type": "Element", "required": False}
    )
    postgis_srid: int = field(
        default=None,
        metadata={"name": "PostgisSrid", "type": "Element", "required": False},
    )
    ogc_uri: str = field(
        default=None, metadata={"name": "OgcUri", "type": "Element", "required": False}
    )

auth_id: str = field(default=None, metadata={'name': 'AuthId', 'type': 'Element', 'required': False}) class-attribute instance-attribute

ogc_uri: str = field(default=None, metadata={'name': 'OgcUri', 'type': 'Element', 'required': False}) class-attribute instance-attribute

postgis_srid: int = field(default=None, metadata={'name': 'PostgisSrid', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(auth_id=None, postgis_srid=None, ogc_uri=None)

Custom dataclass

Bases: DataSet

Source code in src/qgis_server_light/interface/qgis.py
293
294
295
@dataclass
class Custom(DataSet):
    pass

__init__(name, title, id, bbox, bbox_wgs84, path, source, driver, crs, style=None, minimum_scale=None, maximum_scale=None)

DataSet dataclass

Bases: AbstractDataset

Source code in src/qgis_server_light/interface/qgis.py
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
@dataclass
class DataSet(AbstractDataset):
    id: str = field(metadata={"name": "Id", "type": "Element", "required": False})
    bbox: BBox = field(metadata={"name": "BBox", "type": "Element", "required": True})
    bbox_wgs84: BBox = field(
        metadata={"name": "BBoxWgs84", "type": "Element", "required": True}
    )
    path: str = field(metadata={"name": "Path", "type": "Element", "required": True})
    source: DataSource = field(
        metadata={"name": "Source", "type": "Element", "required": True}
    )
    driver: str = field(
        metadata={"name": "Driver", "type": "Element", "required": True}
    )
    crs: Crs = field(metadata={"name": "Crs", "type": "Element", "required": True})
    style: Optional[str] = field(
        default=None, metadata={"name": "Style", "type": "Element", "required": True}
    )
    minimum_scale: float = field(
        default=None,
        metadata={"name": "MinimumScale", "type": "Element", "required": True},
    )
    maximum_scale: float = field(
        default=None,
        metadata={"name": "MaximumScale", "type": "Element", "required": True},
    )

bbox: BBox = field(metadata={'name': 'BBox', 'type': 'Element', 'required': True}) class-attribute instance-attribute

bbox_wgs84: BBox = field(metadata={'name': 'BBoxWgs84', 'type': 'Element', 'required': True}) class-attribute instance-attribute

crs: Crs = field(metadata={'name': 'Crs', 'type': 'Element', 'required': True}) class-attribute instance-attribute

driver: str = field(metadata={'name': 'Driver', 'type': 'Element', 'required': True}) class-attribute instance-attribute

id: str = field(metadata={'name': 'Id', 'type': 'Element', 'required': False}) class-attribute instance-attribute

maximum_scale: float = field(default=None, metadata={'name': 'MaximumScale', 'type': 'Element', 'required': True}) class-attribute instance-attribute

minimum_scale: float = field(default=None, metadata={'name': 'MinimumScale', 'type': 'Element', 'required': True}) class-attribute instance-attribute

path: str = field(metadata={'name': 'Path', 'type': 'Element', 'required': True}) class-attribute instance-attribute

source: DataSource = field(metadata={'name': 'Source', 'type': 'Element', 'required': True}) class-attribute instance-attribute

style: Optional[str] = field(default=None, metadata={'name': 'Style', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(name, title, id, bbox, bbox_wgs84, path, source, driver, crs, style=None, minimum_scale=None, maximum_scale=None)

DataSource dataclass

Source code in src/qgis_server_light/interface/qgis.py
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
@dataclass
class DataSource:
    postgres: PostgresSource = field(
        default=None,
        metadata={"name": "Postgres", "type": "Element", "required": False},
    )
    wmts: WmtsSource = field(
        default=None, metadata={"name": "Wmts", "type": "Element", "required": False}
    )
    wms: WmsSource = field(
        default=None, metadata={"name": "Wms", "type": "Element", "required": False}
    )
    ogr: OgrSource = field(
        default=None, metadata={"name": "Ogr", "type": "Element", "required": False}
    )
    gdal: GdalSource = field(
        default=None, metadata={"name": "Gdal", "type": "Element", "required": False}
    )
    wfs: WfsSource = field(
        default=None, metadata={"name": "Wfs", "type": "Element", "required": False}
    )
    vector_tile: VectorTileSource = field(
        default=None,
        metadata={"name": "VectorTile", "type": "Element", "required": False},
    )

gdal: GdalSource = field(default=None, metadata={'name': 'Gdal', 'type': 'Element', 'required': False}) class-attribute instance-attribute

ogr: OgrSource = field(default=None, metadata={'name': 'Ogr', 'type': 'Element', 'required': False}) class-attribute instance-attribute

postgres: PostgresSource = field(default=None, metadata={'name': 'Postgres', 'type': 'Element', 'required': False}) class-attribute instance-attribute

vector_tile: VectorTileSource = field(default=None, metadata={'name': 'VectorTile', 'type': 'Element', 'required': False}) class-attribute instance-attribute

wfs: WfsSource = field(default=None, metadata={'name': 'Wfs', 'type': 'Element', 'required': False}) class-attribute instance-attribute

wms: WmsSource = field(default=None, metadata={'name': 'Wms', 'type': 'Element', 'required': False}) class-attribute instance-attribute

wmts: WmtsSource = field(default=None, metadata={'name': 'Wmts', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(postgres=None, wmts=None, wms=None, ogr=None, gdal=None, wfs=None, vector_tile=None)

Datasets dataclass

Source code in src/qgis_server_light/interface/qgis.py
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
@dataclass
class Datasets:
    vector: list[Vector] = field(
        default_factory=list,
        metadata={"name": "VectorDataset", "type": "Element", "required": False},
    )
    raster: list[Raster] = field(
        default_factory=list,
        metadata={"name": "RasterDataset", "type": "Element", "required": False},
    )
    custom: list[Custom] = field(
        default_factory=list,
        metadata={"name": "Custom", "type": "Element", "required": False},
    )
    group: list[Group] = field(
        default_factory=list,
        metadata={"name": "GroupDataset", "type": "Element", "required": False},
    )

custom: list[Custom] = field(default_factory=list, metadata={'name': 'Custom', 'type': 'Element', 'required': False}) class-attribute instance-attribute

group: list[Group] = field(default_factory=list, metadata={'name': 'GroupDataset', 'type': 'Element', 'required': False}) class-attribute instance-attribute

raster: list[Raster] = field(default_factory=list, metadata={'name': 'RasterDataset', 'type': 'Element', 'required': False}) class-attribute instance-attribute

vector: list[Vector] = field(default_factory=list, metadata={'name': 'VectorDataset', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(vector=list(), raster=list(), custom=list(), group=list())

Field dataclass

Source code in src/qgis_server_light/interface/qgis.py
77
78
79
80
@dataclass
class Field:
    name: str = field(metadata={"name": "Name", "type": "Element", "required": True})
    type: str = field(metadata={"name": "Type", "type": "Element", "required": True})

name: str = field(metadata={'name': 'Name', 'type': 'Element', 'required': True}) class-attribute instance-attribute

type: str = field(metadata={'name': 'Type', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(name, type)

GdalSource dataclass

Bases: Source

Source code in src/qgis_server_light/interface/qgis.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
@dataclass
class GdalSource(Source):
    path: str = field(metadata={"name": "Path", "type": "Element", "required": True})
    layer_name: Optional[str] = field(
        default=None,
        metadata={"name": "LayerName", "type": "Element", "required": False},
    )

    @property
    def remote(self):
        return self.decide_remote(self.path)

layer_name: Optional[str] = field(default=None, metadata={'name': 'LayerName', 'type': 'Element', 'required': False}) class-attribute instance-attribute

path: str = field(metadata={'name': 'Path', 'type': 'Element', 'required': True}) class-attribute instance-attribute

remote property

__init__(path, layer_name=None)

Group dataclass

Bases: AbstractDataset

Source code in src/qgis_server_light/interface/qgis.py
298
299
300
@dataclass
class Group(AbstractDataset):
    pass

__init__(name, title)

LayerLike dataclass

Source code in src/qgis_server_light/interface/qgis.py
59
60
61
@dataclass
class LayerLike:
    name: str = field(metadata={"name": "Name", "type": "Element", "required": True})

name: str = field(metadata={'name': 'Name', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(name)

MetaData dataclass

Source code in src/qgis_server_light/interface/qgis.py
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
@dataclass
class MetaData:
    service: Service = field(
        metadata={"name": "Service", "type": "Element", "required": True}
    )
    links: Optional[List[str]] = field(
        default_factory=list,
        metadata={"name": "Links", "type": "Element", "required": False},
    )
    language: Optional[str] = field(
        default=None,
        metadata={"name": "Language", "type": "Element", "required": False},
    )
    categories: Optional[List[str]] = field(
        default_factory=list,
        metadata={"name": "Categories", "type": "Element", "required": False},
    )
    creationDateTime: datetime = field(
        default_factory=datetime.utcnow,
        metadata={"name": "CreationDateTime", "type": "Element", "required": False},
    )
    author: Optional[Contact] = field(
        default=None, metadata={"name": "Author", "type": "Element", "required": False}
    )

author: Optional[Contact] = field(default=None, metadata={'name': 'Author', 'type': 'Element', 'required': False}) class-attribute instance-attribute

categories: Optional[List[str]] = field(default_factory=list, metadata={'name': 'Categories', 'type': 'Element', 'required': False}) class-attribute instance-attribute

creationDateTime: datetime = field(default_factory=datetime.utcnow, metadata={'name': 'CreationDateTime', 'type': 'Element', 'required': False}) class-attribute instance-attribute

language: Optional[str] = field(default=None, metadata={'name': 'Language', 'type': 'Element', 'required': False}) class-attribute instance-attribute

service: Service = field(metadata={'name': 'Service', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(service, links=list(), language=None, categories=list(), creationDateTime=datetime.utcnow(), author=None)

OgrSource dataclass

Bases: GdalSource

Source code in src/qgis_server_light/interface/qgis.py
108
109
110
111
112
@dataclass
class OgrSource(GdalSource):
    layer_id: Optional[str] = field(
        default=None, metadata={"name": "LayerId", "type": "Element", "required": False}
    )

layer_id: Optional[str] = field(default=None, metadata={'name': 'LayerId', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(path, layer_name=None, layer_id=None)

PostgresSource dataclass

Bases: Source

Source code in src/qgis_server_light/interface/qgis.py
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
@dataclass
class PostgresSource(Source):
    dbname: str = field(
        metadata={"name": "Dbname", "type": "Element", "required": True}
    )
    geometry_column: str = field(
        metadata={"name": "GeometryColumn", "type": "Element", "required": True}
    )
    host: str = field(metadata={"name": "Host", "type": "Element", "required": True})
    key: str = field(metadata={"name": "Key", "type": "Element", "required": True})
    password: str = field(
        metadata={"name": "Password", "type": "Element", "required": True}
    )
    port: str = field(metadata={"name": "Port", "type": "Element", "required": True})
    schema: str = field(
        metadata={"name": "Schema", "type": "Element", "required": True}
    )
    srid: str = field(metadata={"name": "Srid", "type": "Element", "required": True})
    table: str = field(metadata={"name": "Table", "type": "Element", "required": True})
    type: str = field(metadata={"name": "Type", "type": "Element", "required": True})
    username: str = field(
        metadata={"name": "Username", "type": "Element", "required": True}
    )

dbname: str = field(metadata={'name': 'Dbname', 'type': 'Element', 'required': True}) class-attribute instance-attribute

geometry_column: str = field(metadata={'name': 'GeometryColumn', 'type': 'Element', 'required': True}) class-attribute instance-attribute

host: str = field(metadata={'name': 'Host', 'type': 'Element', 'required': True}) class-attribute instance-attribute

key: str = field(metadata={'name': 'Key', 'type': 'Element', 'required': True}) class-attribute instance-attribute

password: str = field(metadata={'name': 'Password', 'type': 'Element', 'required': True}) class-attribute instance-attribute

port: str = field(metadata={'name': 'Port', 'type': 'Element', 'required': True}) class-attribute instance-attribute

schema: str = field(metadata={'name': 'Schema', 'type': 'Element', 'required': True}) class-attribute instance-attribute

srid: str = field(metadata={'name': 'Srid', 'type': 'Element', 'required': True}) class-attribute instance-attribute

table: str = field(metadata={'name': 'Table', 'type': 'Element', 'required': True}) class-attribute instance-attribute

type: str = field(metadata={'name': 'Type', 'type': 'Element', 'required': True}) class-attribute instance-attribute

username: str = field(metadata={'name': 'Username', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(dbname, geometry_column, host, key, password, port, schema, srid, table, type, username)

Project dataclass

Source code in src/qgis_server_light/interface/qgis.py
383
384
385
386
387
388
@dataclass
class Project:
    version: str = field(
        metadata={"name": "Version", "type": "Element", "required": True}
    )
    name: str = field(metadata={"name": "Name", "type": "Element", "required": True})

name: str = field(metadata={'name': 'Name', 'type': 'Element', 'required': True}) class-attribute instance-attribute

version: str = field(metadata={'name': 'Version', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(version, name)

Raster dataclass

Bases: DataSet

A real QGIS Raster dataset. That are usually all QgsRasterLayer (in opposition to QgsVectorTileLayer which is not a real QgsRasterLayer.

Source code in src/qgis_server_light/interface/qgis.py
272
273
274
275
276
277
@dataclass
class Raster(DataSet):
    """
    A real QGIS Raster dataset. That are usually all `QgsRasterLayer` (in opposition to `QgsVectorTileLayer`
    which is not a real `QgsRasterLayer`.
    """

__init__(name, title, id, bbox, bbox_wgs84, path, source, driver, crs, style=None, minimum_scale=None, maximum_scale=None)

Service dataclass

Source code in src/qgis_server_light/interface/qgis.py
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
@dataclass
class Service:
    contact_organization: Optional[str] = field(
        metadata={"name": "WMSContactOrganization", "type": "Element", "required": True}
    )
    contact_mail: Optional[str] = field(
        metadata={"name": "WMSContactMail", "type": "Element", "required": True}
    )
    contact_person: Optional[str] = field(
        default=None,
        metadata={"name": "WMSContactPerson", "type": "Element", "required": False},
    )
    contact_phone: Optional[str] = field(
        default=None,
        metadata={"name": "WMSContactPhone", "type": "Element", "required": False},
    )
    contact_position: Optional[str] = field(
        default=None,
        metadata={"name": "WMSContactPosition", "type": "Element", "required": False},
    )
    fees: Optional[str] = field(
        default=None, metadata={"name": "WMSFees", "type": "Element", "required": False}
    )
    keyword_list: Optional[str] = field(
        default=None,
        metadata={"name": "WMSKeywordList", "type": "Element", "required": False},
    )
    online_resource: Optional[str] = field(
        default=None,
        metadata={"name": "WMSOnlineResource", "type": "Element", "required": False},
    )
    service_abstract: Optional[str] = field(
        default=None,
        metadata={"name": "WMSServiceAbstract", "type": "Element", "required": False},
    )
    service_title: Optional[str] = field(
        default=None,
        metadata={"name": "WMSServiceTitle", "type": "Element", "required": False},
    )
    resource_url: Optional[str] = field(
        default=None, metadata={"name": "WMSUrl", "type": "Element", "required": False}
    )

contact_mail: Optional[str] = field(metadata={'name': 'WMSContactMail', 'type': 'Element', 'required': True}) class-attribute instance-attribute

contact_organization: Optional[str] = field(metadata={'name': 'WMSContactOrganization', 'type': 'Element', 'required': True}) class-attribute instance-attribute

contact_person: Optional[str] = field(default=None, metadata={'name': 'WMSContactPerson', 'type': 'Element', 'required': False}) class-attribute instance-attribute

contact_phone: Optional[str] = field(default=None, metadata={'name': 'WMSContactPhone', 'type': 'Element', 'required': False}) class-attribute instance-attribute

contact_position: Optional[str] = field(default=None, metadata={'name': 'WMSContactPosition', 'type': 'Element', 'required': False}) class-attribute instance-attribute

fees: Optional[str] = field(default=None, metadata={'name': 'WMSFees', 'type': 'Element', 'required': False}) class-attribute instance-attribute

keyword_list: Optional[str] = field(default=None, metadata={'name': 'WMSKeywordList', 'type': 'Element', 'required': False}) class-attribute instance-attribute

online_resource: Optional[str] = field(default=None, metadata={'name': 'WMSOnlineResource', 'type': 'Element', 'required': False}) class-attribute instance-attribute

resource_url: Optional[str] = field(default=None, metadata={'name': 'WMSUrl', 'type': 'Element', 'required': False}) class-attribute instance-attribute

service_abstract: Optional[str] = field(default=None, metadata={'name': 'WMSServiceAbstract', 'type': 'Element', 'required': False}) class-attribute instance-attribute

service_title: Optional[str] = field(default=None, metadata={'name': 'WMSServiceTitle', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(contact_organization, contact_mail, contact_person=None, contact_phone=None, contact_position=None, fees=None, keyword_list=None, online_resource=None, service_abstract=None, service_title=None, resource_url=None)

Source dataclass

Source code in src/qgis_server_light/interface/qgis.py
88
89
90
91
92
@dataclass
class Source:
    @staticmethod
    def decide_remote(path: str) -> bool:
        return path.startswith("http")

__init__()

decide_remote(path) staticmethod

Source code in src/qgis_server_light/interface/qgis.py
90
91
92
@staticmethod
def decide_remote(path: str) -> bool:
    return path.startswith("http")

Tree dataclass

Source code in src/qgis_server_light/interface/qgis.py
391
392
393
394
395
396
397
398
399
400
401
@dataclass
class Tree:
    members: list[TreeGroup] = field(
        default_factory=list,
        metadata={"name": "Memeber", "type": "Element", "required": False},
    )

    def find_by_name(self, name: str) -> TreeGroup | None:
        for member in self.members:
            if member.name == name:
                return member

members: list[TreeGroup] = field(default_factory=list, metadata={'name': 'Memeber', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(members=list())

find_by_name(name)

Source code in src/qgis_server_light/interface/qgis.py
398
399
400
401
def find_by_name(self, name: str) -> TreeGroup | None:
    for member in self.members:
        if member.name == name:
            return member

TreeGroup dataclass

Bases: TreeLayer

Source code in src/qgis_server_light/interface/qgis.py
69
70
71
72
73
74
@dataclass
class TreeGroup(TreeLayer):
    children: List[str] = field(
        default_factory=list,
        metadata={"name": "Child", "type": "Element", "required": False},
    )

children: List[str] = field(default_factory=list, metadata={'name': 'Child', 'type': 'Element', 'required': False}) class-attribute instance-attribute

__init__(name, children=list())

TreeLayer dataclass

Bases: LayerLike

Source code in src/qgis_server_light/interface/qgis.py
64
65
66
@dataclass
class TreeLayer(LayerLike):
    pass

__init__(name)

Vector dataclass

Bases: DataSet

A real QGIS Vector dataset. That are usually all QgsVectorLayer (in opposition to QgsVectorTileLayer which is not a real QgsVectorLayer.

Source code in src/qgis_server_light/interface/qgis.py
280
281
282
283
284
285
286
287
288
289
290
@dataclass
class Vector(DataSet):
    """
    A real QGIS Vector dataset. That are usually all `QgsVectorLayer` (in opposition to `QgsVectorTileLayer`
    which is not a real `QgsVectorLayer`.
    """

    fields: Optional[List[Field]] = field(
        default_factory=list,
        metadata={"name": "Fields", "type": "Element", "required": True},
    )

fields: Optional[List[Field]] = field(default_factory=list, metadata={'name': 'Fields', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(name, title, id, bbox, bbox_wgs84, path, source, driver, crs, style=None, minimum_scale=None, maximum_scale=None, fields=list())

VectorTileSource dataclass

Bases: Source

Source code in src/qgis_server_light/interface/qgis.py
188
189
190
191
192
193
194
195
196
197
198
199
200
@dataclass
class VectorTileSource(Source):
    styleUrl: str = field(
        metadata={"name": "styleUrl", "type": "Element", "required": True}
    )
    type: str = field(metadata={"name": "Type", "type": "Element", "required": True})
    url: str = field(metadata={"name": "Url", "type": "Element", "required": True})
    zmax: str = field(metadata={"name": "Zmax", "type": "Element", "required": True})
    zmin: str = field(metadata={"name": "Zmin", "type": "Element", "required": True})

    @property
    def remote(self):
        return self.decide_remote(self.url)

remote property

styleUrl: str = field(metadata={'name': 'styleUrl', 'type': 'Element', 'required': True}) class-attribute instance-attribute

type: str = field(metadata={'name': 'Type', 'type': 'Element', 'required': True}) class-attribute instance-attribute

url: str = field(metadata={'name': 'Url', 'type': 'Element', 'required': True}) class-attribute instance-attribute

zmax: str = field(metadata={'name': 'Zmax', 'type': 'Element', 'required': True}) class-attribute instance-attribute

zmin: str = field(metadata={'name': 'Zmin', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(styleUrl, type, url, zmax, zmin)

WfsSource dataclass

Source code in src/qgis_server_light/interface/qgis.py
115
116
117
118
119
@dataclass
class WfsSource:
    # currently not implemented because qgis does not allow to
    # use the decode uri approach on that URI
    pass

__init__()

WmsSource dataclass

Bases: Source

Source code in src/qgis_server_light/interface/qgis.py
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
@dataclass
class WmsSource(Source):
    crs: str = field(metadata={"name": "Crs", "type": "Element", "required": True})
    dpi_mode: str = field(
        metadata={"name": "DpiMode", "type": "Element", "required": True}
    )
    format: str = field(
        metadata={"name": "Format", "type": "Element", "required": True}
    )
    layers: str = field(
        metadata={"name": "Layers", "type": "Element", "required": True}
    )
    url: str = field(metadata={"name": "Url", "type": "Element", "required": True})
    feature_count: int = field(
        default=None,
        metadata={"name": "FeatureCount", "type": "Element", "required": True},
    )
    contextual_wms_legend: str = field(
        default=None,
        metadata={"name": "ContextualWMSLegend", "type": "Element", "required": True},
    )

contextual_wms_legend: str = field(default=None, metadata={'name': 'ContextualWMSLegend', 'type': 'Element', 'required': True}) class-attribute instance-attribute

crs: str = field(metadata={'name': 'Crs', 'type': 'Element', 'required': True}) class-attribute instance-attribute

dpi_mode: str = field(metadata={'name': 'DpiMode', 'type': 'Element', 'required': True}) class-attribute instance-attribute

feature_count: int = field(default=None, metadata={'name': 'FeatureCount', 'type': 'Element', 'required': True}) class-attribute instance-attribute

format: str = field(metadata={'name': 'Format', 'type': 'Element', 'required': True}) class-attribute instance-attribute

layers: str = field(metadata={'name': 'Layers', 'type': 'Element', 'required': True}) class-attribute instance-attribute

url: str = field(metadata={'name': 'Url', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(crs, dpi_mode, format, layers, url, feature_count=None, contextual_wms_legend=None)

WmtsSource dataclass

Bases: WmsSource

Source code in src/qgis_server_light/interface/qgis.py
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
@dataclass(kw_only=True)
class WmtsSource(WmsSource):
    styles: str = field(
        metadata={"name": "Styles", "type": "Element", "required": True}
    )
    tile_dimensions: str = field(
        default=None,
        metadata={"name": "TileDimensions", "type": "Element", "required": True},
    )
    tile_matrix_set: str = field(
        metadata={"name": "TileMatrixSet", "type": "Element", "required": True}
    )
    tile_pixel_ratio: str = field(
        default=None,
        metadata={"name": "TilePixelRatio", "type": "Element", "required": True},
    )

styles: str = field(metadata={'name': 'Styles', 'type': 'Element', 'required': True}) class-attribute instance-attribute

tile_dimensions: str = field(default=None, metadata={'name': 'TileDimensions', 'type': 'Element', 'required': True}) class-attribute instance-attribute

tile_matrix_set: str = field(metadata={'name': 'TileMatrixSet', 'type': 'Element', 'required': True}) class-attribute instance-attribute

tile_pixel_ratio: str = field(default=None, metadata={'name': 'TilePixelRatio', 'type': 'Element', 'required': True}) class-attribute instance-attribute

__init__(crs, dpi_mode, format, layers, url, feature_count=None, contextual_wms_legend=None, *, styles, tile_dimensions=None, tile_matrix_set, tile_pixel_ratio=None)