go-spatial / tegola

Tegola is a Mapbox Vector Tile server written in Go
http://tegola.io/
MIT License
1.25k stars 193 forks source link

Missing land feature at zoom level 8 #858

Closed dwoznicki closed 2 years ago

dwoznicki commented 2 years ago

I've found at least one tile, 8/41/99, which I expect to be marked as land. However, when I view it at zoom level 8, some portion of the tile does not appear to be recognized as land.

image

When I zoom in a tad to zoom level 9, it appears to be recognized as land again.

image

This does not appear to be an issue with the https://tegola-osm-demo.go-spatial.org tiles, so I think it might be related to my instance. I'm working off an instance built from source on the v0.15.x branch. Here's my current commit.

18:12:45 ❯ git rev-parse HEAD
7ac37b942f96a665ada50bad22ca19d3bc0b0cfc

I tried reseeding this tile with

17:53:54 ❯ tegola cache seed tile-name 8/41/99 --format /zxy --concurrency 1 --overwrite --config /opt/tegola-osm/tegola.toml

but that does not appear to have solved the issue.

ARolek commented 2 years ago

@dwoznicki try using the mvt_postgis provider rather than the postgis provider. The postgis provider has some issues with rendering certain polygons.

dwoznicki commented 2 years ago

Cool, I'll give that a shot. It looks like this means I'll need to reseed my tile cache. Is that right?

ARolek commented 2 years ago

Yeah, but mvt_postgis is pretty fast.

dwoznicki commented 2 years ago

Hey @ARolek, I'm having a bit of trouble getting the mvt_postgis provider working. I'm using go-spatial/tegola-osm as my starting point for my tegola.toml file, and I've modified all the SQL queries to call ST_AsMVTGeom(geom_column, !BBOX!) instead of ST_AsBinary(geom_column).

For example,

    # Water
    [[providers.layers]]   
    name = "water_areas"
    geometry_fieldname = "geometry"
    id_fieldname = "osm_id"
    sql = "SELECT ST_AsBinary(geometry) AS geometry, osm_id, name, type, area FROM osm_water_areas WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank', 'dock') AND geometry && !BBOX!"

becomes

    # Water
    [[providers.layers]]
    name = "water_areas"
    geometry_fieldname = "geometry"
    id_fieldname = "osm_id"
    sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type, area FROM osm_water_areas WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank', 'dock') AND geometry && !BBOX!"

However, when I try and start the server, I get an error and the server does not start up.

16:59:41 ❯ tegola server --config /opt/tegola-osm/tegola.toml 
2022-05-27 16:59:49 [INFO] config.go:317: loading local config (/opt/tegola-osm/tegola.toml)
2022-05-27 16:59:49 [WARN] postgis.go:332: Connecting to PostGIS with connection parameters is deprecated. Use 'uri' instead.
Error: could not register providers: error fetching geometry type for layer (water_areas): layer (water_areas) returned unsupported geometry type (<nil>)

I've confirmed that running the SQL query returns null for the geometry column in the database using ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)) in place of !BBOX!.

Do you have any idea what the problem here might be?

iwpnd commented 2 years ago

Hi @dwoznicki

You're not sharing the rest of your config, so I hope you set the provider type correctly

[[providers]]
name = "your_name"
type = "mvt_postgis"  
[...]

!BBOX! can be substituted with ST_MakeEnvelope(min_longitude, min_latitude, max_longitude, max_latitude, SRID). I'm not sure what you expected using ST_Point(4096, 4096). That way you can query your database and check the resulting geometry type. If a row does not have a geometry, tegola will err like that.

You could also try and use:

[[providers.layers]]
name = "your_layer_name"
geometry_type="polygon"
[...]

and tell tegola what geometry type to expect, however if there really is none, that will not work either.

dwoznicki commented 2 years ago

@iwpnd Thanks for the response! I do have my provider type set to "mvt_postgis", though there could easily be some other misconfiguration.

My full tegola.toml config ```toml # This Tegola configuration file reads environment variables for sensitive and installation-specific settings. See # .env-example or simply hardcode correct values for your installation. [webserver] port = ":8004" # Tegola offers three tile caching strategies: "file", "redis", and "s3" [cache] type = "file" # FileCache. See https://github.com/go-spatial/tegola/tree/master/cache/file # RedisCache. See https://github.com/go-spatial/tegola/tree/master/cache/redis # S3Cache. See https://github.com/go-spatial/tegola/tree/master/cache/s3 # bucket = "${S3CACHE_BUCKET}" basepath = "/nvme-ssd/tegola-cache" # region = "${S3CACHE_REGION}" # aws_access_key_id = "${S3CACHE_AWS_ACCESS_KEY_ID}" # aws_secret_access_key = "${S3CACHE_AWS_SECRET_ACCESS_KEY}" [[providers]] name = "all" type = "mvt_postgis" host = "localhost" port = "5435" database = "vector" user = "$USER" password = "$PASSWORD" max_connections = 100 [[providers.layers]] name = "land_8-20" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid FROM land_polygons WHERE wkb_geometry && !BBOX!" # Water [[providers.layers]] name = "water_areas" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type, area FROM osm_water_areas WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank', 'dock') AND geometry && !BBOX!" [[providers.layers]] name = "water_areas_gen0" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type, area FROM osm_water_areas_gen0 WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank') AND area > 1000000000 AND geometry && !BBOX!" [[providers.layers]] name = "water_areas_gen0_6" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type, area FROM osm_water_areas_gen0 WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank') AND area > 100000000 AND geometry && !BBOX!" [[providers.layers]] name = "water_areas_gen1" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type, area FROM osm_water_areas_gen1 WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank') AND area > 1000 AND geometry && !BBOX!" [[providers.layers]] name = "water_lines" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type FROM osm_water_lines WHERE type IN ('river', 'canal', 'stream', 'ditch', 'drain', 'dam') AND geometry && !BBOX!" [[providers.layers]] name = "water_lines_gen0" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type FROM osm_water_lines_gen0 WHERE type IN ('river', 'canal') AND geometry && !BBOX!" [[providers.layers]] name = "water_lines_gen1" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type FROM osm_water_lines_gen1 WHERE type IN ('river', 'canal', 'stream', 'ditch', 'drain', 'dam') AND geometry && !BBOX!" [[providers.layers]] name = "admin_boundaries_8-12" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, admin_level, name, type FROM osm_admin_areas WHERE admin_level IN (1,2,3,4,5,6,7,8) AND geometry && !BBOX!" [[providers.layers]] name = "admin_boundaries_13-20" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, admin_level, name, type FROM osm_admin_areas WHERE admin_level IN (1,2,3,4,5,6,7,8,9,10) AND geometry && !BBOX!" # Land Use [[providers.layers]] name = "landuse_areas" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type, area FROM osm_landuse_areas WHERE geometry && !BBOX!" [[providers.layers]] name = "landuse_areas_gen0" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type, area FROM osm_landuse_areas_gen0 WHERE type IN ('forest','wood','nature reserve', 'nature_reserve', 'military') AND area > 1000000000 AND geometry && !BBOX!" [[providers.layers]] name = "landuse_areas_gen0_6" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type, area FROM osm_landuse_areas_gen0 WHERE type IN ('forest','wood','nature reserve', 'nature_reserve', 'military') AND area > 100000000 AND geometry && !BBOX!" [[providers.layers]] name = "landuse_areas_gen1" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type, area FROM osm_landuse_areas_gen1 WHERE geometry && !BBOX!" # Transport [[providers.layers]] name = "transport_points" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type FROM osm_transport_points WHERE geometry && !BBOX!" [[providers.layers]] name = "transport_areas" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type FROM osm_transport_areas WHERE geometry && !BBOX!" [[providers.layers]] name = "transport_lines_gen0" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, type, tunnel, bridge, ref FROM osm_transport_lines_gen0 WHERE type IN ('motorway','trunk','motorway_link','trunk_link','primary') AND tunnel = 0 AND bridge = 0 AND geometry && !BBOX!" [[providers.layers]] name = "transport_lines_gen1" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, ref, class, type FROM osm_transport_lines_gen1 WHERE type IN ('motorway', 'trunk', 'primary', 'primary_link', 'secondary', 'motorway_link', 'trunk_link') AND geometry && !BBOX!" [[providers.layers]] name = "transport_lines_11-12" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, ref, class, type, tunnel, bridge, access, service FROM osm_transport_lines WHERE type IN ('motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link', 'tertiary', 'tertiary_link', 'rail', 'taxiway', 'runway', 'apron') AND geometry && !BBOX!" [[providers.layers]] name = "transport_lines_13" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, ref, class, type, tunnel, bridge, access, service FROM osm_transport_lines WHERE type IN ('motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link', 'tertiary', 'tertiary_link', 'rail', 'residential', 'taxiway', 'runway', 'apron') AND geometry && !BBOX!" [[providers.layers]] name = "transport_lines_14-20" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, ref, class, type, tunnel, bridge, access, service FROM osm_transport_lines WHERE geometry && !BBOX!" # Amenities [[providers.layers]] name = "amenity_areas" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type FROM osm_amenity_areas WHERE geometry && !BBOX!" [[providers.layers]] name = "amenity_points" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, type FROM osm_amenity_points WHERE geometry && !BBOX!" # Other (Man Made, Historic, Military, Power, Barrier etc) [[providers.layers]] name = "other_points" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type FROM osm_other_points WHERE geometry && !BBOX!" [[providers.layers]] name = "other_lines" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type FROM osm_other_lines WHERE geometry && !BBOX!" [[providers.layers]] name = "other_areas" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type FROM osm_other_areas WHERE geometry && !BBOX!" [[providers.layers]] name = "other_areas_filter" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, class, type FROM osm_other_areas WHERE area > 1000000 AND geometry && !BBOX!" # Buildings [[providers.layers]] name = "buildings" geometry_fieldname = "geometry" id_fieldname = "osm_id" sql = "SELECT ST_AsMVTGeom(geometry, !BBOX!) AS geometry, osm_id, name, nullif(as_numeric(height),-1) AS height, type FROM osm_buildings WHERE geometry && !BBOX!" # Natural earth [[providers.layers]] name = "ne_110m_populated_places" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, scalerank, labelrank, name, min_zoom, featurecla, rank_max FROM ne_110m_populated_places WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_populated_places" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, scalerank, labelrank, name, min_zoom, featurecla, rank_max FROM ne_50m_populated_places WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_populated_places" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, scalerank, labelrank, name, min_zoom, featurecla, rank_max FROM ne_10m_populated_places WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_admin_0_label_points" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, sr_subunit, scalerank FROM ne_10m_admin_0_label_points WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_admin_1_label_points" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, name, scalerank FROM ne_10m_admin_1_label_points WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_110m_admin_0_boundary_lines_land" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, min_zoom FROM ne_110m_admin_0_boundary_lines_land WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_admin_0_boundary_lines_land" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, min_zoom FROM ne_50m_admin_0_boundary_lines_land WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_admin_0_boundary_lines_land" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, min_zoom FROM ne_10m_admin_0_boundary_lines_land WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_admin_0_boundary_lines_disputed_areas" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, min_zoom FROM ne_50m_admin_0_boundary_lines_disputed_areas WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_admin_0_boundary_lines_disputed_areas" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, min_zoom FROM ne_10m_admin_0_boundary_lines_disputed_areas WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_110m_admin_0_countries" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, name_long, abbrev, adm0_a3, min_zoom, min_label, max_label FROM ne_110m_admin_0_countries WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_admin_0_countries" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, name_long, abbrev, adm0_a3, min_zoom, min_label, max_label FROM ne_50m_admin_0_countries WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_admin_0_countries" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, name_long, abbrev, adm0_a3, min_zoom, min_label, max_label FROM ne_10m_admin_0_countries WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_110m_admin_1_states_provinces_lines" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, adm0_name, min_zoom FROM ne_110m_admin_1_states_provinces_lines WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_admin_1_states_provinces_lines" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, adm0_name, min_zoom FROM ne_50m_admin_1_states_provinces_lines WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_admin_1_states_provinces_lines" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, adm0_name, min_zoom, min_label FROM ne_10m_admin_1_states_provinces_lines WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_110m_land" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, min_zoom FROM ne_110m_land WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_land" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, min_zoom FROM ne_50m_land WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_land" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, min_zoom FROM ne_10m_land WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_50m_admin_1_states_provinces_lakes" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, featurecla, name, postal, min_zoom, min_label FROM ne_50m_admin_1_states_provinces_lakes WHERE wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_roads_3" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, name, min_zoom, min_label, type, label FROM ne_10m_roads WHERE min_zoom < 5 AND type <> 'Ferry Route' AND wkb_geometry && !BBOX!" [[providers.layers]] name = "ne_10m_roads_5" geometry_fieldname = "geometry" id_fieldname = "ogc_fid" sql = "SELECT ST_AsMVTGeom(wkb_geometry, !BBOX!) AS geometry, ogc_fid, name, min_zoom, min_label, type, label FROM ne_10m_roads WHERE min_zoom <= 7 AND type <> 'Ferry Route' AND wkb_geometry && !BBOX!" [[maps]] name = "osm" attribution = "OpenStreetMap" # map attribution center = [-76.275329586789, 39.153492567373, 8.0] # optional center value. part of the TileJSON spec [[maps.layers]] name = "populated_places" provider_layer = "all.ne_110m_populated_places" min_zoom = 0 max_zoom = 2 [[maps.layers]] name = "populated_places" provider_layer = "all.ne_50m_populated_places" min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "populated_places" provider_layer = "all.ne_10m_populated_places" min_zoom = 5 max_zoom = 20 [[maps.layers]] name = "country_lines" provider_layer = "all.ne_110m_admin_0_boundary_lines_land" min_zoom = 0 max_zoom = 2 [[maps.layers]] name = "country_lines" provider_layer = "all.ne_50m_admin_0_boundary_lines_land" dont_simplify = true min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "country_lines" provider_layer = "all.ne_10m_admin_0_boundary_lines_land" min_zoom = 5 max_zoom = 10 [[maps.layers]] name = "country_lines_disputed" provider_layer = "all.ne_50m_admin_0_boundary_lines_disputed_areas" min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "country_lines_disputed" provider_layer = "all.ne_10m_admin_0_boundary_lines_disputed_areas" min_zoom = 5 max_zoom = 10 [[maps.layers]] name = "country_label_points" provider_layer = "all.ne_10m_admin_0_label_points" min_zoom = 3 max_zoom = 20 [[maps.layers]] name = "country_polygons" provider_layer = "all.ne_110m_admin_0_countries" min_zoom = 0 max_zoom = 2 [[maps.layers]] name = "country_polygons" provider_layer = "all.ne_50m_admin_0_countries" min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "country_polygons" provider_layer = "all.ne_10m_admin_0_countries" min_zoom = 5 max_zoom = 10 [[maps.layers]] name = "state_lines" provider_layer = "all.ne_110m_admin_1_states_provinces_lines" min_zoom = 0 max_zoom = 2 [[maps.layers]] name = "state_lines" provider_layer = "all.ne_50m_admin_1_states_provinces_lines" min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "state_lines" provider_layer = "all.ne_10m_admin_1_states_provinces_lines" min_zoom = 5 max_zoom = 10 # Land Polygons [[maps.layers]] name = "land" provider_layer = "all.ne_110m_land" min_zoom = 0 max_zoom = 2 [[maps.layers]] name = "land" provider_layer = "all.ne_50m_land" min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "land" provider_layer = "all.ne_10m_land" min_zoom = 5 max_zoom = 7 [[maps.layers]] name = "land" provider_layer = "all.land_8-20" dont_simplify = true min_zoom = 8 max_zoom = 20 [[maps.layers]] name = "admin_lines" provider_layer = "all.admin_boundaries_8-12" min_zoom = 8 max_zoom = 12 [[maps.layers]] name = "admin_lines" provider_layer = "all.admin_boundaries_13-20" min_zoom = 13 max_zoom = 20 [[maps.layers]] name = "state_label_points" provider_layer = "all.ne_10m_admin_1_label_points" min_zoom = 3 max_zoom = 20 # Land Use [[maps.layers]] name = "landuse_areas" provider_layer = "all.landuse_areas_gen0" min_zoom = 3 max_zoom = 5 [[maps.layers]] name = "landuse_areas" provider_layer = "all.landuse_areas_gen0_6" min_zoom = 6 max_zoom = 9 [[maps.layers]] name = "landuse_areas" provider_layer = "all.landuse_areas_gen1" min_zoom = 10 max_zoom = 12 [[maps.layers]] name = "landuse_areas" provider_layer = "all.landuse_areas" min_zoom = 13 max_zoom = 20 # Water Areas [[maps.layers]] name = "water_areas" provider_layer = "all.water_areas_gen0" min_zoom = 3 max_zoom = 5 [[maps.layers]] name = "water_areas" provider_layer = "all.water_areas_gen0_6" min_zoom = 6 max_zoom = 9 [[maps.layers]] name = "water_areas" provider_layer = "all.water_areas_gen1" min_zoom = 10 max_zoom = 12 [[maps.layers]] name = "water_areas" provider_layer = "all.water_areas" min_zoom = 13 max_zoom = 20 # Water Lines [[maps.layers]] name = "water_lines" provider_layer = "all.water_lines_gen0" min_zoom = 8 max_zoom = 12 [[maps.layers]] name = "water_lines" provider_layer = "all.water_lines_gen1" min_zoom = 13 max_zoom = 14 [[maps.layers]] name = "water_lines" provider_layer = "all.water_lines" min_zoom = 15 max_zoom = 20 # Transport Lines (Roads, Rail, Aviation) [[maps.layers]] name = "transport_lines" provider_layer = "all.ne_10m_roads_3" min_zoom = 3 max_zoom = 4 [[maps.layers]] name = "transport_lines" provider_layer = "all.ne_10m_roads_5" min_zoom = 5 max_zoom = 6 [[maps.layers]] name = "transport_lines" provider_layer = "all.transport_lines_gen0" min_zoom = 7 max_zoom = 8 [[maps.layers]] name = "transport_lines" provider_layer = "all.transport_lines_gen1" min_zoom = 9 max_zoom = 10 [[maps.layers]] name = "transport_lines" provider_layer = "all.transport_lines_11-12" min_zoom = 11 max_zoom = 12 [[maps.layers]] name = "transport_lines" provider_layer = "all.transport_lines_13" min_zoom = 13 max_zoom = 13 [[maps.layers]] name = "transport_lines" provider_layer = "all.transport_lines_14-20" min_zoom = 14 max_zoom = 20 # Transport Areas [[maps.layers]] name = "transport_areas" provider_layer = "all.transport_areas" min_zoom = 12 max_zoom = 20 # Transport Points [[maps.layers]] name = "transport_points" provider_layer = "all.transport_points" min_zoom = 14 max_zoom = 20 # Amenity Areas [[maps.layers]] name = "amenity_areas" provider_layer = "all.amenity_areas" min_zoom = 14 max_zoom = 20 # Amenity Points [[maps.layers]] name = "amenity_points" provider_layer = "all.amenity_points" min_zoom = 14 max_zoom = 20 # Other Points [[maps.layers]] name = "other_points" provider_layer = "all.other_points" min_zoom = 14 max_zoom = 20 # Other Lines [[maps.layers]] name = "other_lines" provider_layer = "all.other_lines" min_zoom = 14 max_zoom = 20 # Other Areas [[maps.layers]] name = "other_areas" provider_layer = "all.other_areas_filter" min_zoom = 6 max_zoom = 8 [[maps.layers]] name = "other_areas" provider_layer = "all.other_areas" min_zoom = 9 max_zoom = 20 # Buildings [[maps.layers]] name = "buildings" provider_layer = "all.buildings" min_zoom = 14 max_zoom = 20 ```

Taking a look at my SQL statement log, it looks like the first query Tegola runs to check the geometry type for table land_polygons succeeds.

vector=# SELECT ST_GeometryType(geometry) FROM (SELECT ST_AsMVTGeom(wkb_geometry, ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857)) AS geometry, ogc_fid FROM land_polygons WHERE wkb_geometry && ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857)) as q LIMIT 1;
 st_geometrytype 
-----------------
 ST_Polygon
(1 row)

But the osm_water_areas table query returns null.

vector=# SELECT ST_GeometryType(geometry) FROM (SELECT ST_AsMVTGeom(geometry, ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857)) AS geometry, osm_id, name, type, area FROM osm_water_areas WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank', 'dock') AND geometry && ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857)) as q LIMIT 1;
 st_geometrytype 
-----------------

(1 row)

It looks like the ST_AsMVTGeom call is returning a null geometry for this table, so it makes sense that the ST_GeometryType call is failing.

vector=# SELECT ST_AsMVTGeom(geometry, ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857)) AS geometry, osm_id, name, type, area FROM osm_water_areas WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank', 'dock') AND geometry && ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857) limit 1;
 geometry | osm_id |   name    | type  |   area    
----------+--------+-----------+-------+-----------
          |   -976 | Elms Pond | water | 1609.9071
(1 row)

The ST_AsBinary function does return a geometry for this row.

vector=# SELECT ST_AsBinary(geometry) as geometry from osm_water_areas WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank', 'dock') AND geometry && ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857) AND osm_id = -976;
                                                                                                                                                                                                                                                                                                                                               geometry                                                                                                                                                                                                                                                                                                                                               
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 \x0103000000020000000f0000001f9bcbf1bfd5d0c0d8c07276148259415b2f9b4d4ad5d0c01800956d16825941e67cd9bc73d3d0c036875ec418825941ba2badb3dccfd0c093526b991b8259413fb3a173f4cbd0c076ece65c1d82594161fdbcba99c8d0c0e00c2adb1d8259414c1df6e080c6d0c0bbfa60ce1c825941a43345efcfc4d0c04d511d741b8259412beac9ead6c3d0c0be26ad071a825941ae637cd9adc7d0c0b30a8bc018825941866571e26bccd0c0d6f594571682594158df2ec576d0d0c09cbd3a89138259411553653ab8d2d0c04383b49a118259412b68911d75d4d0c0484d45e6118259411f9bcbf1bfd5d0c0d8c0727614825941050000003b2b8d75c5ccd0c0ef51d969198259411ef79220b7ccd0c0c3295e1418825941f5bcc785e5cbd0c0afe93c5918825941e6ba792808ccd0c073231c7a198259413b2b8d75c5ccd0c0ef51d96919825941
(1 row)
iwpnd commented 2 years ago

Hm, pretty hard to debug without setting it up myself. What is the result if you set the geometry type yourself for the provider layer?

dwoznicki commented 2 years ago

Hey, I think that did the trick! I just went through and added geometry_type = "polygon" to every [[providers.layer]] that was the Tegola server was unable to determine the geometry type for at startup, and the map looks like it's loading properly.

For reference, here are the provider layers I added the geometry type to. - water_areas - water_areas_gen0 - water_areas_gen0_6 - water_areas_gen1 - water_lines - water_lines_gen0 - water_lines_gen1 - admin_boundaries_8-12 - landuse_areas - landuse_areas_gen0 - landuse_areas_gen0_6 - landuse_areas_gen1 - transport_areas - transport_lines_gen0 - transport_lines_gen1 - transport_lines_11-12 - transport_lines_13 - transport_lines_14-20 - amenity_areas - other_lines - other_areas - othe_areas_filter - buildings - ne_10m_admin_1_states_provinces_lines

I checked a couple lakes, and some other water areas, and the shapes look correct to me. I also isolated a geometry query that Tegola ran for one of the lakes I was checking, and the result contained a valid looking geometry.

vector=# SELECT left(ST_AsMVTGeom(geometry, ST_MakeEnvelope(-1.361924394984375e+07,4.618019500234375e+06,-1.3540972432890624e+07,4.6962910171875e+06,3857)), 20) AS geometry, osm_id, name, type, area FROM osm_water_areas_gen0 WHERE type IN ('water', 'pond', 'basin', 'canal', 'mill_pond', 'riverbank') AND area > 100000000 AND geometry && ST_MakeEnvelope(-1.361924394984375e+07,4.618019500234375e+06,-1.3540972432890624e+07,4.6962910171875e+06,3857);
       geometry       | osm_id  |      name      | type  |      area      
----------------------+---------+----------------+-------+----------------
 0103000020110F000018 | -304026 | Lake Berryessa | water | 1.25422984e+08
(1 row)

So my guess is that the ST_MakeEnvelope(-2.0663680475625e+07,-2.0663680475625e+07,2.0663680475625e+07,2.0663680475625e+07,3857) box is somehow not capturing any geometries for the layers listed above. But, as you've probably noticed, I don't know much about GIS, so take that with a grain of salt.

iwpnd commented 2 years ago

Awesome!

dwoznicki commented 2 years ago

Using "mvt_postgis" also solves the original issue of missing land geometries for me.

image

Thanks for your help @iwpnd @ARolek !

ARolek commented 2 years ago

Nice! Glad you got it working. Onward!

dwoznicki commented 2 years ago

In case you find it interesting, I did some benchmarks on reseeding my tile cache using mvt_postgis as a provider, and rendering all tiles between zoom 0 and 9 took 5 minutes (!) on my current setup. I can't remember exactly how long it took to do the same with postgis provider, but it was somewhere in the realm of 6+ hours. Nice performance boost!

ARolek commented 2 years ago

@dwoznicki nice! the postgres mvt generator / encoder is fantastic. Glad it's working well for you.