二维、三维地图的底图一般都是用图片切片(瓦片),将大的影像数据,或是矢量配色好的图层集合,通过工具,切成地图切片,以文件的形式存放,或者是存放到mbtiles数据库中;数据发布工具Arcgis Server或Geoserver也可将影像数据,实时的按照客户端地图范围,切成地图切片,返回到客户端进行显示。
切片数据可以直接按照目录发布,也可发布成tms、wmts服务,开源的二维地图引擎leaflet、openlayers等,或商用的高德、百度地图引擎,都能直接利用api进行加载显示。
开源切片工具
分享一款开源的地图切片类库,使用python语言进行调用,使用方法比较简单,地图的切片效率也比较高。
开源类库的网址是:https://github.com/tehamalab/gdal2tiles
开发的时候,需要先安装python的gdal类库,可通过conda或者pip进行安装,接着需要安装gdal2tiles的类库,通过pip install gdal2tiles进行安装。
调用的方式比较简单,其中需要配置一些参数,具体可参见网站上的说明。
切片配置说明:
python实际调用代码
importgdal2tiles#设置需要切图的级别,设置恢复模式,显示生成切片的输出options = {'zoom': (11, 12), 'resume': True,'verbose':True}
gdal2tiles.generate_tiles('输入的影像文件', '输出的切片文件夹', **options)
生成的切片是按照目录进行组织:
文件夹中,有3个网页文件,可直接在浏览器中,打开进行数据预览。
引言二维、三维地图的底图一般都是用图片切片(瓦片),将大的影像数据,或是矢量配色好的图层集合,通过工具,切成地图切片,以文件的形式存放,或者是存放到mbtiles数据库中;数据发布工具Arcgis Server或Geoserver也可将影像数据,实时的按照客户端地图范围,切成地图切片,返回到客户端进行显示。切片数据可以直接按照目录发布,也可发布成tms、wmts服务,开源的二维地图引擎leafle...
一直以来,作为一个GIS开发者,都想自己去实现栅格
切片
和矢量
切片
。前面的博文中,已经介绍了如何实现矢量
切片
,刚刚进入GIS行业的人一般都是用GeoServer进行栅格
切片
,速度效率很低。这里介绍一下如何
使用
代码高效地进行栅格
切片
,主要是依赖
gdal
2tiles这个python
库
。
我的电脑环境是
python3.9.5
GDAL
3.3.0
执行下面的安装命令 安装
gdal
2tiles
pip install
gdal
2tiles
切片
代码
def qie():
#tif所在位置,存放位置(文件夹不在则自动创建,
切片
格式)
gdal
2tiles.generate_tiles('E:/job/hy/hy00.tif', 'E:/job/raw3/', np_processes=2,zoom='2-17')
if __name__ == '__main__':
qie()
错误显示需要用RB/RGBA格式的tif
下面我们
使用
Global Mapper再次对tif进行绘制修改
gdal
2tiles(以下简称g2t),这个历史悠久的
切
图
脚本依然能发挥其功用,因为它稳定的做好了它应做的东西.相比前面说过的
gdal
2mbtiles(以下简称g2m),我倒是更喜欢它,单文件脚本,运行只安装一个
GDAL
库
足矣.同样因为有了g2m,我也是带着对比的心态提出几个问题:
从表现来看,g2t更慢
慢的原因是什么
可以采用g2m加速吗
与g2m对比,其算法有何差异
gdal
.Warp工具可以用于坐标系转换、投影变换、
图
像合并与镶嵌、地理范围
裁
剪、更改分辨率、矢量
裁
剪等方面,关键的参数在于options,可参考文档
gdal
.Warp的说明,通过文档中osgeo.
gdal
.Warp、osgeo.
gdal
.WarpOptions这两个模块的说明,可以了解到
gdal
.Warp的具体应用方式,本文主要是针对矢量
裁
剪的功能进行说明。
options的主要参数如下:
WarpOptions(options=None, format=None,
outputBounds=None,
打开矢量
图
层,并显示基本信息。
图
层数,驱动名,
图
层网格范围,属性表结构信息,矢量元素,及矢量元素的属性
public static void info(String srcFile) {
// 读取原
图
DataSource srcDataSource = ogr.Open(srcFile, 0);
if (srcDataSource == null) {
System.err.println("
GDAL
Open failed - " + gd
driver =
gdal
.GetDriverByName(“ENVI”)
dataset = driver.Create(resultname, line, sample, 1,
gdal
.GDT_Float32)
dataset.GetRasterBand(1).WriteArray(d
要
使用
Java
和
GDAL
库
进行
切片
,可以按照以下步骤进行:
1. 安装
GDAL
库
。可以从
GDAL
官方网站下载适合您的操作系统的安装程序,并按照说明进行安装。
2. 在
Java
项目中引入
GDAL
库
。可以
使用
Maven 或手动下载并添加
GDAL
的
Java
绑定
库
。
3.
使用
GDAL
的
Java
API 进行
切片
。以下是一个基本的示例代码,它将一个 GeoTIFF 格式的文件
切
成多个小的 JPEG 格式的文件:
import org.
gdal
.
gdal
.Dataset;
import org.
gdal
.
gdal
.TranslateOptions;
import org.
gdal
.
gdal
.
gdal
;
import org.
gdal
.
gdal
const.
gdal
constConstants;
public class
GDAL
Tile {
public static void main(String[] args) {
gdal
.AllRegister();
Dataset dataset =
gdal
.Open("input.tif",
gdal
constConstants.GA_ReadOnly);
int width = dataset.GetRasterXSize();
int height = dataset.GetRasterYSize();
int tileSize = 256;
int tileColumns = (width + tileSize - 1) / tileSize;
int tileRows = (height + tileSize - 1) / tileSize;
for (int i = 0; i < tileRows; i++) {
for (int j = 0; j < tileColumns; j++) {
int x = j * tileSize;
int y = i * tileSize;
String outputFilename = String.format("tile_%d_%d.jpg", i, j);
TranslateOptions options = new TranslateOptions(new String[] {
"-of", "JPEG",
"-outsize", String.format("%d", tileSize), String.format("%d", tileSize),
"-srcwin", String.format("%d", x), String.format("%d", y), String.format("%d", tileSize), String.format("%d", tileSize)
gdal
.Translate(outputFilename, dataset, options);
dataset.delete();
请注意,此示例代码仅适用于 GeoTIFF 格式的文件。如果您需要处理其他格式的文件,您需要相应地更改代码。