44
44
from pygeoapi .provider .base_mvt import BaseMVTProvider
45
45
from pygeoapi .provider .postgresql import PostgreSQLProvider
46
46
from pygeoapi .provider .base_tile import ProviderTileNotFoundError
47
- from pygeoapi .util import url_join
47
+ from pygeoapi .util import url_join , get_crs_from_uri
48
48
49
49
LOGGER = logging .getLogger (__name__ )
50
50
51
51
WEBMERCATORQUAD = TileMatrixSetEnum .WEBMERCATORQUAD .value
52
52
WORLDCRS84QUAD = TileMatrixSetEnum .WORLDCRS84QUAD .value
53
53
54
- CRS_CODES = {
55
- 'http://www.opengis.net/def/crs/OGC/1.3/CRS84' : 4326 ,
56
- 'https://www.opengis.net/def/crs/OGC/0/CRS84' : 4326 ,
57
- 'http://www.opengis.net/def/crs/EPSG/0/3857' : 3857
58
- }
59
54
60
-
61
- class MVTPostgreSQLProvider (BaseMVTProvider , PostgreSQLProvider ):
55
+ class MVTPostgreSQLProvider (PostgreSQLProvider , BaseMVTProvider ):
62
56
"""
63
57
MVT PostgreSQL Provider
64
58
Provider for serving tiles rendered on-the-fly from
@@ -82,11 +76,14 @@ def __init__(self, provider_def):
82
76
83
77
def get_fields (self ):
84
78
"""
85
- Get Postgrres fields
79
+ Get Postgres columns
86
80
87
- :returns: `dict ` of item fields
81
+ :returns: `list ` of columns
88
82
"""
89
- PostgreSQLProvider .get_fields (self )
83
+ return [
84
+ column for column in self .table_model .__table__ .columns
85
+ if column .name != self .geom
86
+ ]
90
87
91
88
def get_layer (self ):
92
89
"""
@@ -136,34 +133,30 @@ def get_tiles(self, layer='default', tileset=None,
136
133
if format_ == 'mvt' :
137
134
format_ = self .format_type
138
135
139
- geom_column = getattr (self .table_model , self .geom )
140
- tile_envelope = func .ST_TileEnvelope (z , x , y )
141
136
[tileset_schema ] = [
142
137
schema for schema in self .get_tiling_schemes ()
143
138
if tileset == schema .tileMatrixSet
144
139
]
145
-
146
140
if not self .is_in_limits (tileset_schema , z , x , y ):
141
+ LOGGER .warning (f'Tile { z } /{ x } /{ y } not found' )
147
142
return ProviderTileNotFoundError
148
143
144
+ geom_column = getattr (self .table_model , self .geom )
145
+ tile_envelope = func .ST_TileEnvelope (z , x , y )
149
146
if tileset_schema .crs != self .storage_crs :
150
- LOGGER .debug ('Transforming geometry' )
151
- tile_envelope = func .ST_Transform (
152
- tile_envelope , CRS_CODES [tileset_schema .crs ]
153
- )
154
- geom_column = func .ST_Transform (
155
- geom_column , CRS_CODES [tileset_schema .crs ]
156
- )
147
+ target_srid = get_crs_from_uri (tileset_schema .crs ).to_string ()
148
+ LOGGER .debug (f'Transforming geometry to { target_srid } ' )
157
149
158
- all_columns = [
159
- c for c in self .table_model .__table__ .columns if c .name != 'geom'
150
+ tile_envelope = func .ST_Transform (tile_envelope , target_srid )
151
+ geom_column = func .ST_Transform (geom_column , target_srid )
152
+
153
+ mvt_columns = [
154
+ * self .get_fields (),
155
+ func .ST_AsMVTGeom (geom_column , tile_envelope )
160
156
]
161
- all_columns .append (
162
- func .ST_AsMVTGeom (geom_column , tile_envelope ).label ('mvt' )
163
- )
164
157
tile_query = select (
165
158
func .ST_AsMVT (
166
- select (* all_columns )
159
+ select (* mvt_columns )
167
160
.select_from (self .table_model )
168
161
.cte ('tile' )
169
162
.table_valued (),
@@ -173,7 +166,8 @@ def get_tiles(self, layer='default', tileset=None,
173
166
174
167
with Session (self ._engine ) as session :
175
168
result = session .execute (tile_query ).scalar ()
176
- return bytes (result ) or None
169
+
170
+ return bytes (result ) or None
177
171
178
172
def get_html_metadata (self , dataset , server_url , layer , tileset ,
179
173
title , description , keywords , ** kwargs ):
0 commit comments