基于Martin实现MapboxGL自定义底图

news2025/1/16 2:48:56

概述

本文分享基于Martin实现MapboxGL底图的自定义。

实现后效果

image.png

Martin简介

image.png

Martin 是一个瓦片服务器,它能够从 PostGIS 数据库、PMTiles(本地或远程)以及 [MBTiles] (https://github.com/mapbox/mbtiles-spec) 文件中快速生成并提供矢量瓦片 ,允许动态地将多个瓦片源合并为一个。Martin 专为速度和大量流量进行了优化,使用 Rust 语言编写。

它可以:

  • 使用POSTGIS数据库、MBTiles、PMTiles发布矢量切片;
  • svg图自动生成精灵图;
  • otf, ttf, ttc自动生成字体切片;

实现

config.yaml配置文件

推荐使用*.yaml配置文件,配置文件的内容可参考如下:

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

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

# Set TileJSON URL path prefix. This overides the default of respecting the X-Rewrite-URL header.
# Only modifies the JSON (TileJSON) returned, martins' API-URLs remain unchanged. If you need to rewrite URLs, please use a reverse proxy.
# Must begin with a `/`.
# Examples: `/`, `/tiles`
base_path: /tiles

# Number of web server workers
worker_processes: 8

# Amount of memory (in MB) to use for caching tiles [default: 512, 0 to disable]
cache_size_mb: 1024

# If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching.  Default could be different depending on Martin version.
preferred_encoding: gzip

# Enable or disable Martin web UI. At the moment, only allows `enable-for-all` which enables the web UI for all connections. This may be undesirable in a production environment. [default: disable]
web_ui: enable

# 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} 'postgres://<database_username>:<database_userpassword>@<hostaddress>:<port_no>/<database_name>'
  connection_string: 'postgresql://postgres:root@localhost:5432/lzugis'

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

  # Maximum Postgres 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: quick]
  # 'calc' - compute table geometry bounds on startup.
  # 'quick' - same as 'calc', but the calculation will be aborted if it takes more than 5 seconds.
  # 'skip' - do not compute table geometry bounds on startup.
  auto_bounds: skip

  # Enable automatic discovery of tables and functions.
  # You may set this to `false` to disable.
  auto_publish:
    # Optionally limit to just these schemas
    from_schemas:
      - public
    # Here we enable both tables and functions auto discovery.
    # You can also enable just one of them by not mentioning the other,
    # or setting it to false.  Setting one to true disables the other one as well.
    # E.g. `tables: false` enables just the functions auto-discovery.
    tables:
      # Optionally set how source ID should be generated based on the table's name, schema, and geometry column
      source_id_format: 'base_{table}'
      # Add more schemas to the ones listed above
      # A table column to use as the feature ID
      # If a table has no column with this name, `id_column` will not be set for that table.
      # If a list of strings is given, the first found column will be treated as a feature ID.
      id_columns: gid
      # Boolean to control if geometries should be clipped or encoded as is, optional, default to true
      clip_geom: true
      # Buffer distance in tile coordinate space to optionally clip geometries, optional, default to 64
      buffer: 64
      # Tile extent in tile coordinate space, optional, default to 4096
      extent: 4096

  # Associative arrays of table sources
  tables:
    my_province:
      # ID of the MVT layer (optional, defaults to table name)
      layer_id: my_province

      # Table schema (required)
      schema: public

      # Table name (required)
      table: province

      # Geometry SRID (required)
      srid: 4326

      # Geometry column name (required)
      geometry_column: geom

      # Feature id column name
      id_column: gid

      # An integer specifying the minimum zoom level
      minzoom: 0

      # An integer specifying the maximum zoom level. MUST be >= minzoom
      maxzoom: 22

      # The maximum extent of available map tiles. Bounds MUST define an area
      # covered by all zoom levels. The bounds are represented in WGS:84
      # latitude and longitude values, in the order left, bottom, right, top.
      # Values may be integers or floating point numbers.
      bounds: [ -180.0, -90.0, 180.0, 90.0 ]

      # Tile extent in tile coordinate space
      extent: 4096

      # Buffer distance in tile coordinate space to optionally clip geometries
      buffer: 64

      # Boolean to control if geometries should be clipped or encoded as is
      clip_geom: true

      # Geometry type
      geometry_type: GEOMETRY

      # List of columns, that should be encoded as tile properties (required)
      properties:
        gid: int4

  # Associative arrays of function sources
  functions:
    function_source_id:
      # Schema name (required)
      schema: public

      # Function name (required)
      function: function_zxy_query

      # An integer specifying the minimum zoom level
      minzoom: 0

      # An integer specifying the maximum zoom level. MUST be >= minzoom
      maxzoom: 20

      # The maximum extent of available map tiles. Bounds MUST define an area
      # covered by all zoom levels. The bounds are represented in WGS:84
      # latitude and longitude values, in the order left, bottom, right, top.
      # Values may be integers or floating point numbers.
      bounds: [ -180.0, -90.0, 180.0, 90.0 ]

# Publish MBTiles files
mbtiles:
  paths:
    # scan this whole dir, matching all *.mbtiles files
    # - /dir-path
    # specific mbtiles file will be published as mbtiles2 source
    - ./world_cities.mbtiles
  sources:
    # named source matching source name to a single file
    # mb-src1: /path/to/mbtiles1.mbtiles      
sprites:
  paths:
    # all SVG files in this dir will be published as a "my_images" sprite source
    # - ./icons   
  sources:
    # SVG images in this directory will be published as a "my_sprites" sprite source
    banks: ./icons
# Font configuration
fonts:
  # A list of *.otf, *.ttf, and *.ttc font files and dirs to search recursively.
  - ./font/msyh.ttf

启动

本示例是在windows环境中,在cmd命令行输入如下命令:

.\martin.exe --config ./config.yaml

启动后界面如下。
image.png

访问http://localhost:3000/catalog,返回数据如下:
image.png

前端调用

前端调用的代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>mapbox</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="lib/mapbox-gl.css" type="text/css">
    <link rel="stylesheet" href="style/map.css" type="text/css">
    <script src="lib/mapbox-gl.js"></script>
</head>

<body>
    <div id="map" class="map"></div>
    <script>
        var style = {
            "version": 8,
            "name": "Mapbox Streets",
            "sprite": "http://127.0.0.1:3000/sprite/banks",
            "glyphs": "http://127.0.0.1:3000/font/Microsoft YaHei Regular/{fontstack}/{range}.pbf",
            "sources": {
                "base-tile": {
                    "type": "vector",
                    "tiles": ['http://127.0.0.1:3000/my_province,base_capital,base_city,base_railway,base_buildings/{z}/{x}/{y}'],
                }
            },
            "layers": [
                {
                    "id": "my_province_fill",
                    "type": "fill",
                    "source": "base-tile",
                    'source-layer': 'my_province',
                    "paint": {
                        "fill-color": "#f00",
                        "fill-opacity": 0.2
                    }
                },
                {
                    "id": "my_province_line",
                    "type": "line",
                    "source": "base-tile",
                    'source-layer': 'my_province',
                    "paint": {
                        "line-color": "#f00",
                        "line-width": 1
                    }
                },
                {
                    "id": "base_capital",
                    "type": "symbol",
                    "source": "base-tile",
                    'source-layer': 'base_capital',
                    'layout': {
                        'icon-image': 'nongye',
                        'icon-size': 0.06,
                        'icon-allow-overlap': true,
                        'text-field': ['get', 'name'],
                        'text-size': 12,
                        'text-allow-overlap': true,
                        'text-justify': 'center',
                        'text-offset': [0, 1.5],
                        "text-font": [
                            "Microsoft YaHei Regular"
                        ]
                    },
                    paint: {
                        'text-color': 'rgb(159, 96, 55)',
                        'text-halo-color': '#fff',
                        'text-halo-width': 1.8,
                        'icon-color': '#f00',
                    }
                },
            ]
        }
        var map = new mapboxgl.Map({
            container: 'map', // container ID
            style: style,
            center: [107.11040599933166, 34.26271532332011], // starting position [lng, lat]
            zoom: 3,
            doubleClickZoom: false,
            hash: false,
            localFontFamily: true,
            logoPosition: 'bottom-right'
        });
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七人共享拼团:社交电商的裂变新引擎

在当今电商市场中&#xff0c;七人共享拼团模式以其独特的社交属性和裂变机制&#xff0c;正成为一股不可忽视的力量。这一模式巧妙融合了社交电商的互动性与拼购的实惠性&#xff0c;通过平台利润回馈用户的方式&#xff0c;构建了一个既人性化又高效的奖励体系&#xff0c;旨…

QT 添加程序图标

1. 使用免费网站将其他图片格式转化成ico格式 Ico转换器 &#xff1a; https://cn.free-converter.com/ico-converter 2.qmake项目添加程序图标 在.pro文件内添加语句,如下图 RC_ICONS favicon.ico2.1 程序图标文件添加到项目目录内 2.2 通过windeployqt xxx.exe构建生成的…

动手研发实时口译系统

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

一文通晓 AI 框架

首先深度学习是机器学习研究领域中的一种范式&#xff0c;而深度学习的概念源于对人工神经网络的研究&#xff0c;很多深度学习算法都使用神经网络进行表示&#xff0c;因为神经网络的性能精度和通用效果都非常好&#xff0c;于是业界习惯性地把深度学习算法等同于 AI。 深度学…

GNSS位移监测站:高精度、高稳定性、高安全性

在现代工程与自然灾害监测领域&#xff0c;GNSS位移监测站以其卓越的功能优势&#xff0c;正逐步成为守护安全、预防灾害的重要工具。其采用的直径114mm加强型立杆&#xff0c;不仅坚固耐用&#xff0c;更严格遵循《地质灾害专群结合监测领警技术指南&#xff08;试行&#xff…

企业建设零信任体系的核心思路

根据安全牛的调查研究发现&#xff0c;零信任安全理念已经较广泛得到国内各类型企业用户的认可&#xff0c;组织对应用零信任进行网络安全建设已经初具信心&#xff0c;零信任理念对网络安全防护工作的价值开始多方面的展现。 企业开展零信任网络建设的需求和驱动因素 本次调…

86.SAP ME工艺路线打开错误

目录 1.SAP ME工艺路线维护界面 2.错误情况 3.解决方法 1.SAP ME工艺路线维护界面 这个功能设计采用jnlp的方式打开&#xff0c;JNLP&#xff08;Java Network Launching Protocol &#xff09;是java提供的一种可以通过浏览器直接执行java应用程序的途径&#xff0c;它使你…

图论------如何使用矩阵来存储图的信息(邻接矩阵表示法)。

文章概述&#xff1a; 刚开始图论我们先不急于解决实际的问题&#xff0c;先去搞明白如何存储图的信息。实际上我们早就接触过类似的内容&#xff0c;比如上一篇文章的开灯关灯游戏中&#xff0c;我们使用一维数组来表示一排灯的状态&#xff0c;但是如果要表示更加复杂的内容怎…

【STM32】ADC模拟数字转换(规则组单通道)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 ADC简介 ADC时钟配置 引脚模拟输入模式 规则组通道选择 ADC初始化 工作模式 数据对齐 触发转换方式 连续与单次转换模式 扫描模式 组内的通道个数 ADC初始化框架 ADC上电 ADC校…

高质量翻译对高质量内容和用户体验的影响

在当今全球化的数字环境中&#xff0c;高质量翻译在塑造高质量内容和用户体验方面的重要性怎么强调都不为过。随着公司和开发人员在不同地区和文化中扩大影响力&#xff0c;有效地翻译成为确保内容与不同受众产生共鸣的关键因素。高质量的翻译不仅保留了原始内容的完整性&#…

【网络层】上

目录 一. 网络层功能概述二. SDN的基本功能2.1 数据平面2.2 控制平面&#xff08;传统方法/每路由器法&#xff09;2.3 控制平面&#xff08;SDN方法&#xff09; 三. 路由算法与路由协议四. IP数据报4.1 IP数据报格式4.2 IP数据报分片4.3 IP地址 &#xff08;IPV4&#xff09;…

2024年华为认证H12-811题库(超级好用的刷题软件)

某个ACL规则如下:则下列哪些IP地址可以被permit规则匹配&#xff1a; rule 5 permit ip source 10.0.2.0 0.0.254.255 A、10.0.4.5 B、10.0.5.6 C、10.0.6.7 D、10.0.2.1 试题答案&#xff1a;A;C;D 试题解析&#xff1a; 10.0.2.000001010.00000000.00000010.0000000…

php 匿名类

https://andi.cn/page/621667.html

TMGM原油返佣是多少

在全球金融市场中&#xff0c;原油交易一直是投资者的重要选择之一。其中&#xff0c;交易平台的选择更是关系到投资者盈利的关键因素。TMGM&#xff0c;作为一家全球领先的在线交易提供商&#xff0c;以其公正、透明的交易环境和优质的服务赢得了广大投资者的信赖。那么&#…

【python小脚本】摄像头rtsp流转hls m3u8 格式web端播放

写在前面 工作需要&#xff0c;简单整理实际上这种方式延迟太高了&#xff0c;后来前端直接接的海康的的插件博文内容为 摄像头 rtsp 实时流转 hls m3u8 的一个 Python 脚本理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c…

【TiDB】07-tiup工具安装及使用

目录 1、在线安装 1.2、脚本代码如下 2、离线安装 2.1、下载安装包 2.2、安装脚本 3、卸载 4、常用命令 TiDB 提供了丰富的工具&#xff0c;可以帮助你进行部署运维、数据管理&#xff08;例如&#xff0c;数据迁移、备份恢复、数据校验&#xff09;、在 TiKV 上运行 S…

意大利Panel触摸屏维修显示屏EBP419 EMBEDDED

意大利Panel触摸屏维修显示屏维修EBP400系列EMBEDDED PC EBP419 panel维修产品主要包括&#xff1a;操作面板,触摸屏,终端机,触摸面板等。应用于包装、食品饮料、纺织与各种工业自动化领域。 panel触摸屏无论是机械工程、装置或单个应用,HMI几乎都可以简化操作,并且通过HMI,还…

大数据技术——DolphinScheduler的集群部署

目录 第1章 DolphinScheduler简介 1.1 DolphinScheduler概述 1.2 DolphinScheduler核心架构 第2章 DolphinScheduler部署说明 2.1 软硬件环境要求 2.1.1 操作系统版本要求 2.1.2 服务器硬件要求 2.2 部署模式 2.2.1 单机模式 2.2.2 伪集群模式 2.2.3 集群模式 第3章…

语音转文字例会纪要有什么好?一分钟掌握5款语音转文字软件

你是否曾在紧张的会议现场&#xff0c;因笔记跟不上发言者语速而焦虑不已&#xff1f;亦或是在采访结束后&#xff0c;面对一堆录音文件感到头大&#xff0c;不知如何迅速整理成可用的文本&#xff1f; 别急&#xff0c;科技的进步总能给我们惊喜。今天&#xff0c;我要为你带…

Golang多版本环境安装并存

1. 准备 请先安装最新版本的Go&#xff0c;详见 https://go.dev/doc/install go version2. 配置镜像加速 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct3. 安装Go指定版本 Golang官方提供dl工具来实现多版本的Go环境管理&#xff0c;详见项目&#…