PostGIS 矢量瓦片

这篇具有很好参考价值的文章主要介绍了PostGIS 矢量瓦片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


title: PostGIS 矢量瓦片
date: 2023-08-07
author: ac
tags:

  • vector tile
    categories:
  • Database

Martin - 基于PostGIS的矢量瓦片服务器

1. 简介

目前流行的矢量瓦片的切图方案:

  • mapbox gl + tippecanoe :v2收费,tippecanoe是mapbox官方推荐的矢量瓦片静态生成工具 ,适用于大数据量场景,且不频繁更新的空间数据;
  • openlayers + geoserver :开源,使用geoserver的矢量瓦片扩展,增加矢量瓦片的输出格式;
  • maplibre+ Martin +postgis :开源,martin是矢量切片服务器,通过postgis的函数动态生成矢量瓦片。
  • maptiler:收费

mapbox v2 必须使用 access token 才能初始化 Map 对象。进行token计算,每月50000免费次数。

2. Martin

Martin是一个开源的PostGIS矢量切片服务器,可以从任何PostGIS表或视图中创建MVT矢量切片,也可以从 PMTile 和MBTile文件中动态生成矢量瓦片,是使用 Rust编写,针对切片速度和大流量进行了优化,是极快且轻量级的切片服务器。

2.1 安装

如果将Martin和PostgreSQL一起使用,PostGIS版本必须为v3.0+

Martin支持Linux、macOS、windows平台和docker环境,本例采用windows环境。先从github上下载martin-Windows-x86_64 。解压后会发现这两个exe:

─martin-Windows-x86_64
  ├─martin.exe
  └─mbtiles.exe

windows平台可以直接使用martin.exe来启动切片服务器,可以先在命令行查看一下参数:

D:\tools\vectorTileTool\martin-Windows-x86_64>martin.exe --help
Blazing fast and lightweight tile server with PostGIS, MBTiles, and PMTiles support

Usage: martin.exe [OPTIONS] [CONNECTION]...

Arguments:
  [CONNECTION]...  Connection strings, e.g. postgres://... or /path/to/files

Options:
  -c, --config <CONFIG>
          Path to config file. If set, no tile source-related parameters are allowed
      --save-config <SAVE_CONFIG>
          Save resulting config to a file or use "-" to print to stdout. By default, only print if sources are auto-detected
  -s, --sprite <SPRITE>
          Export a directory with SVG files as a sprite source. Can be specified multiple times
  -k, --keep-alive <KEEP_ALIVE>
          Connection keep alive timeout. [DEFAULT: 75]
  -l, --listen-addresses <LISTEN_ADDRESSES>
          The socket address to bind. [DEFAULT: 0.0.0.0:3000]
  -W, --workers <WORKERS>
          Number of web server workers
  -b, --disable-bounds
          Disable the automatic generation of bounds for spatial PG tables
      --ca-root-file <CA_ROOT_FILE>
          Loads trusted root certificates from a file. The file should contain a sequence of PEM-formatted CA certificates
  -d, --default-srid <DEFAULT_SRID>
          If a spatial PG table has SRID 0, then this default SRID will be used as a fallback
  -p, --pool-size <POOL_SIZE>
          Maximum connections pool size [DEFAULT: 20]
  -m, --max-feature-count <MAX_FEATURE_COUNT>
          Limit the number of features in a tile from a PG table source
  -h, --help
          Print help
  -V, --version
          Print version
2.2 使用

本例pg安装postgis是v3.3.3.1

martin连接pg可以用connection_string(命令行参数)和配置文件两种形式。

PostgreSQL连接字符串的形式:

# martin.exe postgresql://user:password@host/db
D:\tools\vectorTileTool\martin-Windows-x86_64>martin.exe postgresql://postgres:123@127.0.0.1:5433/postgres
[2023-08-08T03:50:11Z INFO  martin] Starting Martin v0.8.7
[2023-08-08T03:50:11Z INFO  martin] Config file is not specified, auto-detecting sources
[2023-08-08T03:50:11Z INFO  martin::pg::pool] Connecting to postgresql://postgres:123@127.0.0.1:5433/postgres
[2023-08-08T03:50:11Z INFO  martin::pg::configurator] Discovered source zhujiang_river from table public.zhujiang_river with geom column (MULTIPOLYGON, SRID=4326)
[2023-08-08T03:50:11Z INFO  martin] Use --save-config to save or print Martin configuration.
[2023-08-08T03:50:11Z INFO  martin] Martin has been started on 0.0.0.0:3000.
[2023-08-08T03:50:11Z INFO  martin] Use http://0.0.0.0:3000/catalog to get the list of available sources.

配置文件的形式 config.yaml:

# Connection keep alive timeout [default: 75]
keep_alive: 75

# The socket address to bind [default: 0.0.0.0:3000]
listen_addresses: '127.0.0.1:3000'

# Number of web server workers
worker_processes: 8
# Database configuration. This can also be a list of PG configs.
postgres:
  # Database connection string. You can use env vars too, for example:
  #   $DATABASE_URL
  #   ${DATABASE_URL:-postgresql://postgres@localhost/db}
  connection_string: 'postgresql://postgres@localhost:5433/postgres?sslmode=disable&user=postgres&password=123'
  
  # Same as PGSSLCERT for psql
  #ssl_cert: './postgresql.crt'
  # Same as PGSSLKEY for psql
  #ssl_key: './postgresql.key'
  # Same as PGSSLROOTCERT for psql
  #ssl_root_cert: './root.crt'

  #  If a spatial table has SRID 0, then this SRID will be used as a fallback
  default_srid: 4326

  # Maximum connections pool size [default: 20]
  pool_size: 20

  # Limit the number of table geo features included in a tile. Unlimited by default.
  max_feature_count: 1000

  # Control the automatic generation of bounds for spatial tables [default: false]
  # If enabled, it will spend some time on startup to compute geometry bounds.
  disable_bounds: false
D:\tools\vectorTileTool\martin-Windows-x86_64>martin.exe -c config.yaml
[2023-08-08T03:54:43Z INFO  martin] Starting Martin v0.8.7
[2023-08-08T03:54:43Z INFO  martin] Using config.yaml
[2023-08-08T03:54:43Z INFO  martin::pg::pool] Connecting to postgresql://postgres@localhost:5433/postgres?sslmode=disable&user=postgres&password=123
[2023-08-08T03:54:43Z INFO  martin::pg::configurator] Discovered source zhujiang_river from table public.zhujiang_river with geom column (MULTIPOLYGON, SRID=4326)
[2023-08-08T03:54:44Z INFO  martin] Use --save-config to save or print Martin configuration.
[2023-08-08T03:54:44Z INFO  martin] Martin has been started on 127.0.0.1:3000.
[2023-08-08T03:54:44Z INFO  martin] Use http://127.0.0.1:3000/catalog to get the list of available sources.

本例采用的是配置文件的形式启动服务器,服务地址是http://127.0.0.1:3000

从启动的日志可以看到Martin将所连接的pg库中的zhujiang_river表发布为数据源。

Martin 会将所有表发布为数据源(如果它们至少有一个几何列)。如果 SRID 为 0,则必须设置默认 SRID,否则该地理列/表将被忽略。所有非几何表列都将发布为矢量切片要素标签(属性)。

PostGIS 矢量瓦片,postgresql

打开目录可以看到已发布的数据源:
PostGIS 矢量瓦片,postgresql
PostGIS 矢量瓦片,postgresql

数据表的元数据是符合TileJSON 3.0.0标准的JSON文件。

TileJSON是表示地图元数据的开放标准

2.3 mapbox

发布完数据源后,使用mapbox gl 来调用一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/mapbox-gl@1.9.1/dist/mapbox-gl.js"></script>
    <link href="https://unpkg.com/mapbox-gl@1.9.1/dist/mapbox-gl.css"/>
    <style>
        #map{
            height: 100vh;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="map"></div>
    <script>
        
        const TIANDITU_URL = 'http://t0.tianditu.gov.cn';
        const tdtKey = "your_token";
        const tdtConfig = {
            code: 'tdt_img',
            name: '天地图影像',
            source: {
                type: 'raster',
                tiles: [
                    `${TIANDITU_URL}/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${tdtKey}`
                ],
                tileSize: 256,
                minzoom: 0,
                maxzoom: 22
            },
            layer: {
                id: 'tdt-img-tiles',
                type: 'raster',
                minzoom: 0,
                maxzoom: 22,
                layout: { visibility: 'visible' }
            }
        }
        let map = new mapboxgl.Map({
            container:'map',
            style:{
                "version":8,
                "sources":{},
                "layers":[],
                glyphs: "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
            },
            center: [112.39747, 22.908823], // 广东
            zoom: 8, // starting zoom 地图初始的拉伸比例
            pitch: 0, // 地图的角度,不写默认是0,取值是0-85度,一般在3D中使用
            bearing: 0, // 地图的初始方向,值是北的逆时针度数,默认是0,即是正北
            antialias: true, // 抗锯齿,通过false关闭提升性能
            minZoom: 3,
            maxZoom: 17.36
        });
        map.on('load', () => {
            // 天地图底图加载
            addLayerConfig(tdtConfig);
            addMvt();
        });
        function addLayerConfig(layerConfig){
            const {code, source,layer} = layerConfig;
            map.addSource(code, source);
            const layerParams = {
                ...layer,
                source: code
            };
            // 添加图层
            map.addLayer(layerParams);
        }
        function addMvt(){
            map.addLayer({
                id: 'lines',
                type: 'fill',
                source: {
                    type: 'vector',
                    url: 'http://localhost:3000/zhujiang_river'
                },
                'source-layer': 'zhujiang_river',
                paint: {
                	'fill-color': 'red'
                }
            });
        }
    </script>
</body>
</html>

加载效果:

PostGIS 矢量瓦片,postgresql

3.遇到的问题

局限性:只能连接一个pg库。

对于有分库的系统,可以使用Nginx来转发。

参考文章

[1] Martin https://martin.maplibre.org/

[2] Martin Tile Server Documentation https://maplibre.org/martin/installation.html文章来源地址https://www.toymoban.com/news/detail-643216.html

到了这里,关于PostGIS 矢量瓦片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安装PostgreSQL和PostGIS

    安装环境 Windows 2019 Standard Server 安装PostgreSQL 安装PostgreSQL 16 安装PostGIS 用PostgreSQL 16对应的PostGIS https://download.osgeo.org/postgis/windows/pg16/ https://download.osgeo.org/postgis/windows/pg16/postgis-bundle-pg16x64-setup-3.4.1-1.exe 创建数据库,比如gisdb 关键的一步: 数据库右键单击 【查询工具】输入以

    2024年02月19日
    浏览(48)
  • arcgis+postgresql+postgis使用介绍

    关于arcgis在postgresql创建地理数据库我分享一下自己的经历: 众所周知,arcgis如果在oracle中创建地理数据库,必须要使用ArcToolbox里面的地理数据库工具去创建,在里面发现它还可以创建sql_server, postgresql数据库类型,于是我按照arcgis,pg对应版本去弄了一下,并且复制desktop扩展

    2024年02月11日
    浏览(35)
  • centos7安装 postgresql postgis pgrouting

    centos7 源码编译太烦了。直接yum install ...... 一、版本信息: CentOS版本:CentOS Linux release 7.9.2009 (Core) PostgreSQL版本: PostgreSQL 12.0 PostGIS版本:postgis31 二、PostgresSQL + PostGIS 安装 1、官网安装链接: PostgreSQL: Linux downloads  2、升级所有包同时也升级软件和系统内核 yum -y update 3、安装

    2024年02月12日
    浏览(42)
  • Postgresql 12.2 + PostGIS 3.0.1 安装部署

    参考文档: 按照该文档安装即可,如果遇到报错,可以参考下文: https://blog.csdn.net/weixin_41166785/article/details/127674169 所需的安装包 在资源里面(我看下怎么可以不用积分下载) 1、no acceptable C compiler found in $PATH 参考:https://blog.csdn.net/IT_LPF/article/details/107360501 2、library ‘xml2’

    2024年01月17日
    浏览(35)
  • 在Centos系统源码安装postgreSQL数据库及postGIS扩展

    安装前 PostGIS扩展通常需要安装一些依赖项。 1.GDAL: PostGIS需要GDAL(Geospatial Data Abstraction Library)来处理地理空间数据格式。 2.GEOS: GEOS(Geometry Engine - Open Source)是一个用于处理地理空间数据的C++库。 3.Proj: Proj是用于地图投影的库。 postgreSQL与postGIS插件的版本支持关系 版本对

    2024年04月27日
    浏览(62)
  • Windows下载安装 PostgreSQL和PostGIS工具,并解决The pgAdmin 4 server could not be contacted:

    目录 一、PostgreSQL下载安装 二、PostGIS工具软件下载 三、测试:使用paAdmin4管理数据库 解决The pgAdmin 4 server could not be contacted:  (1)这里使用 EnterpriseDB 来下载安装,EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商。 下载地址:Download PostgreSQL。 根据自己

    2024年02月05日
    浏览(86)
  • ARM系统下的postgis12 和postgis13安装

    目录 一、环境 二、安装 1、安装docker 2、安装postgis(里面包含postgres) 三、测试 四、使用 五、问题 linux的系统在终端输入: uname -a  Linux host-10-208-254-221 4.19.90-2112.8.0.0131.oe1.aarch64 #1 SMP Fri Dec 31 19:53:20 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux 搞不懂是什么系统??? 在网上搜索arm下

    2024年02月02日
    浏览(69)
  • postgis数据库导出csv表再导入postgis

    直接拖过去 再导入postgis数据库中

    2024年02月10日
    浏览(49)
  • 【Unity 学习笔记】规则瓦片和动态瓦片的应用

            上一篇笔记记录了瓦片调色板的应用,瓦片调色板常用于游戏场景的绘制,可以完全按照作者的想法绘制地图,自由度大。但是瓦片调色板也有其缺点,就是需要人一点一点地绘制。在这片笔记中,我将介绍两种新添加的瓦片,即规则瓦片和动态瓦片,有了这两类

    2024年02月10日
    浏览(41)
  • Web地图服务规范之栅格瓦片地图服务:WMTS(WebMapTileService,网络地图瓦片服务)、TMS(TileMapService,瓦片地图服务)和XYZ

    这四种地图服务都是通过网络传输的栅格瓦片地图服务,这里有三个名词需要解释: 遥感影像、Dem等,就是图片。 实际上,地图服务就是一个url,且这个url满足一定条件:基于这个url拼上固定参数或路由地址可以获取地图服务的元数据信息(返回结果是xml或者json);也能获得

    2024年02月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包