在Slippy Map标准下本地提供地理空间栅格瓦片服务。
项目描述
🌐 本地地理空间栅格瓦片服务器
需要可视化本地的大(数GB)栅格数据? 这适用于您。
一个Flask应用程序,用于从大型的栅格文件中提供符合Slippy Maps标准(即,/zoom/x/y.png
)的瓦片
免责声明:我在这周末将这些内容整合在一起,我肯定会在接下来的时间里对一些东西进行更改,以使其更稳定/健壮。这意味着在次要版本之间,东西很可能会出问题(我使用的是major.minor.patch
版本控制方案)。
🌟 突出特点
- 创建大型地理空间图像的本地瓦片服务器
- 使用
ipyleaflet
查看本地栅格文件 - 交互式提取感兴趣区域(ROI)
在底层,该程序使用large_image
在后台线程中启动瓦片服务器,该服务器将栅格图像提供给瓦片查看器(请参阅下面的ipyleaflet
示例)。这个瓦片服务器可以高效地为您提供不同级别的细节;最好有预瓦片的、云优化GeoTIFF(COG),但如果不是,也不要担心,因为当打开栅格时large_image
会为您瓦片和缓存。
包含一个基于CesiumJS和GeoJS的独立网络查看器。您可以使用网络查看器从栅格中选择并提取感兴趣的区域。
⬇️ 安装
从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
🥓 同时使用两个光栅
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
进行感兴趣区域提取
我已经包含了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
🗺️ 示例数据集
与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
然后您可以使用上述相同的过程提取ROI。
我放大了科罗拉多州的黄金市并绘制了我想要创建的DEM范围的多边形
然后进行提取
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
这是另一个使用虚拟地球卫星图像的示例
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
🖥️ 本地Web应用程序
从命令行启动tileserver,使用包含的Web应用程序,您可以查看光栅并提取感兴趣区域。
python -m tileserver path/to/raster.tif
您可以使用Web查看器提取感兴趣区域
使用说明
get_leaflet_tile_layer
接受现有的TileClient
或创建TileClient
的路径。- 调色板选项来自
palettable
。