跳转到主要内容

在Slippy Map标准下本地提供地理空间栅格瓦片服务。

项目描述

🌐 本地地理空间栅格瓦片服务器

codecov PyPI pypi-activity

需要可视化本地的大(数GB)栅格数据? 这适用于您。

一个Flask应用程序,用于从大型的栅格文件中提供符合Slippy Maps标准(即,/zoom/x/y.png)的瓦片

免责声明:我在这周末将这些内容整合在一起,我肯定会在接下来的时间里对一些东西进行更改,以使其更稳定/健壮。这意味着在次要版本之间,东西很可能会出问题(我使用的是major.minor.patch版本控制方案)。

tile-diagram

🌟 突出特点

  • 创建大型地理空间图像的本地瓦片服务器
  • 使用ipyleaflet查看本地栅格文件
  • 交互式提取感兴趣区域(ROI)

在底层,该程序使用large_image在后台线程中启动瓦片服务器,该服务器将栅格图像提供给瓦片查看器(请参阅下面的ipyleaflet示例)。这个瓦片服务器可以高效地为您提供不同级别的细节;最好有预瓦片的、云优化GeoTIFF(COG),但如果不是,也不要担心,因为当打开栅格时large_image会为您瓦片和缓存。

包含一个基于CesiumJSGeoJS的独立网络查看器。您可以使用网络查看器从栅格中选择并提取感兴趣的区域。

⬇️ 安装

从PyPI安装: https://pypi.ac.cn/project/flask-tileserver/

pip install flask-tileserver

📝 关于安装GDAL的简要说明

安装GDAL可能会让人头疼,你可能想在安装flask-tileserver之前处理GDAL。

如果在Linux上,我强烈推荐使用Kitware提供的large_image_wheels

pip install --find-links=https://girder.github.io/large_image_wheels --no-cache GDAL

否则,我建议使用conda

conda install -c conda-forge GDAL

💭 反馈

请在讨论区分享您的想法和问题。如果您想报告任何错误或提出功能请求,请打开一个问题。

如果提交错误报告,请分享一个scooby Report

import tileserver
print(tileserver.Report())

🚀 使用方法

🍃 ipyleaflet 栅格图层

TileClient类是一个巧妙的工具,可以作为一个后台线程启动一个瓦片服务器,从您本地的文件系统上的任何光栅文件中提供图像瓦片。此外,它可以与get_leaflet_tile_layer实用程序一起使用,在Jupyter笔记本中进行交互式可视化,创建一个ipyleaflet.TileLayer。以下是一个示例:

from tileserver import get_leaflet_tile_layer, TileClient
from ipyleaflet import Map

# First, create a tile server from local raster file
tile_client = TileClient('~/Desktop/TC_NG_SFBay_US_Geo.tif')

# Create ipyleaflet tile layer from that server
t = get_leaflet_tile_layer(tile_client)

# Create ipyleaflet map, add tile layer, and display
m = Map(center=tile_client.center())
m.add_layer(t)
m

ipyleaflet

🥓 同时使用两个光栅

from tileserver import get_leaflet_tile_layer
from ipyleaflet import Map, ScaleControl, FullScreenControl, SplitMapControl

# Create 2 tile layers from 2 separate raster files
l = get_leaflet_tile_layer('~/Desktop/TC_NG_SFBay_US_Geo.tif',
                           band=1, palette='matplotlib.Viridis_20', vmin=50, vmax=200)
r = get_leaflet_tile_layer('~/Desktop/small.tif',
                           band=2, palette='matplotlib.Plasma_6', vmin=0, vmax=150)

# Make the ipyleaflet map
m = Map(center=(37.7249511580583, -122.27230466902257), zoom=9)
control = SplitMapControl(left_layer=l, right_layer=r)
m.add_control(control)
m.add_control(ScaleControl(position='bottomleft'))
m.add_control(FullScreenControl())
m

ipyleaflet-double

🎯 使用ipyleaflet进行感兴趣区域提取

我已经包含了get_leaflet_roi_controls实用程序,用于创建一些leaflet UI控件,可以从瓦片客户端中提取感兴趣区域。您可以如下使用它,然后绘制一个多边形并单击“提取ROI”按钮。

输出默认保存在您的工作目录中(在Jupyter笔记本旁边)。

from tileserver import get_leaflet_tile_layer, get_leaflet_roi_controls
from tileserver import TileClient
from ipyleaflet import Map

# First, create a tile server from local raster file
tile_client = TileClient('~/Desktop/TC_NG_SFBay_US_Geo.tif')

# Create ipyleaflet tile layer from that server
t = get_leaflet_tile_layer(tile_client)

# Create ipyleaflet controls to extract an ROI
draw_control, roi_control = get_leaflet_roi_controls(tile_client)

# Create ipyleaflet map, add layers, add controls, and display
m = Map(center=(37.7249511580583, -122.27230466902257), zoom=9)
m.add_layer(t)
m.add_control(draw_control)
m.add_control(roi_control)
m

ipyleaflet-draw-roi

🗺️ 示例数据集

tileserver一起包含了一些示例数据集。其中一个特别有用的数据集包含全球高程数据,您可以使用它创建局部区域的高分辨率数字高程模型(DEM)。

from tileserver import get_leaflet_tile_layer, get_leaflet_roi_controls, examples
from ipyleaflet import Map

# Load example tile layer from publicly available DEM source
tile_client = examples.get_elevation()

# Create ipyleaflet tile layer from that server
t = get_leaflet_tile_layer(tile_client,
                           band=1, vmin=-500, vmax=5000,
                           palette='matplotlib.Plasma_6',
                           opacity=0.75)

# Create ipyleaflet controls to extract an ROI
draw_control, roi_control = get_leaflet_roi_controls(tile_client)

m = Map(zoom=2)
m.add_layer(t)
m.add_control(draw_control)
m.add_control(roi_control)
m

elevation

然后您可以使用上述相同的过程提取ROI。

我放大了科罗拉多州的黄金市并绘制了我想要创建的DEM范围的多边形

golden

然后进行提取

roi_path = '...'  # Look in your working directory

r = get_leaflet_tile_layer(roi_path, band=1,
                           palette='matplotlib.Plasma_6', opacity=0.75)

m2 = Map(
        center=(39.763427033262175, -105.20614908076823),
        zoom=12,
       )
m2.add_layer(r)
m2

golden-dem

这是另一个使用虚拟地球卫星图像的示例

from tileserver import get_leaflet_tile_layer, examples
from ipyleaflet import Map

# Load example tile layer from publicly available imagery
tile_client = examples.get_virtual_earth()

# Create ipyleaflet tile layer from that server
t = get_leaflet_tile_layer(tile_client, opacity=1)

m = Map(center=(39.751343612695145, -105.22181306125279), zoom=18)
m.add_layer(t)
m

kafadar

🖥️ 本地Web应用程序

从命令行启动tileserver,使用包含的Web应用程序,您可以查看光栅并提取感兴趣区域。

python -m tileserver path/to/raster.tif

cesium-viewer

您可以使用Web查看器提取感兴趣区域

webviewer-roi

使用说明

  • get_leaflet_tile_layer接受现有的TileClient或创建TileClient的路径。
  • 调色板选项来自palettable

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面