0.概述:
GlobalMapper是一款功能强大的小型化GIS栅格影像、矢量数据处理、加工软件,其本身具备了GIS软件产品的几乎所有特性,做到了将复杂的问题简单化,哪怕你是对GIS一无所知的用户都可以很快的上手,简单直观的功能设计都能够帮助你以最快的速度完成所需要的工作,完成加工数据成品的任务。
界面化的操作,对数据操作之前要先打开数据,大数据的处理,自动化处理极其不便。其脚本可以有效解决这些问题。本文主要基于GlobalMapper的脚本实现对影像、地形、示例数据的大数据脚本话自动操作。
以下所有脚本都是基于GlobalMapperV20实现。
1.数据获取
LSV下载数据
1.1lsv获得影像数据:
LSV有近千种图源,都可以直接下载为tif格式的影像数据
谷歌影像:
谷歌历史影像:
ArcGIS影像:
天地图影像:
微软影像:
其他影像数据:
各种道路图
各种地形晕渲图:
各种地质图与地质详图
天地图各种分省图:
各种海图:
各种历史图:
各种气象图:
各种透明图;
各种专题图:
1.2LSV获得的地形数据:
谷歌地形(90米)
ETOP(1.8km地形)
SRTM3 90米地形
Alster30米地形:
Alos12米地形:
5米地形:
1.3LSV获得的POI数据
1.4LSV能获得的建筑轮廓数据
1.5快速标绘或者矢量化数据;
1.6本教程示例数据
DEM:
数据范围:
为了让数据适用效果更好,再在右下角绘制一个矩形,并下载影像和
2.tif影像和地形合并脚本
2.1合并指定的tif格式的地形文件到一个文件中
脚本如下:
//地形合并
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//定义输出文件变量
DEFINE_VAR NAME="OUTPUT_FILE" VALUE="D:\GlobalMappper\script_sample_data\result\dem_merge.tif"
//导入文件名
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dem1\SRTM3_V4_90m.tif" ELEV_UNITS="METERS"
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dem2\Export14-15-59.tif" ELEV_UNITS="METERS"
//导出地形数据
EXPORT_ELEVATION FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFF ELEV_UNITS="METERS"
上述文件,存储为后缀为gms的文本文件
注:默认情况下不支持中文,如需支持中文,请设置编码格式为gb2312
脚本执行方式1:
打开GlobalMapper20,文件下的【run script】菜单
对比一下原始数据,和结果数据:
脚本执行方式2:
无需打开globalmapper软件即可直接执行
编写配套的命令行文件:
chcp指编码格式(主要是中文):
chcp 65001 就是换成UTF-8代码页
chcp 936 可以换回默认的GBK
chcp 437 是美国英语
/showprogress 指显示进度信息
@echo off
chcp 65001
"C:\Program Files\GlobalMapper20_64bit\global_mapper.exe" merge_dem_tif.gms /showprogress
pause
上述文本另存为后缀为bat的文保文件
直接双击即可:
结果和方法1一致。
2.2合并指定的tif格式的影像文件到一个文件中
//影像合并
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//定义输出文件变量
DEFINE_VAR NAME="OUTPUT_FILE" VALUE="D:\GlobalMappper\script_sample_data\result\dom_merge.tif"
//导入文件名
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dom1\13\dem范围谷歌影像.tif"
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dom2\13\dem范围2谷歌影像.tif"
//导出栅格数据
EXPORT_RASTER FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFF
结果如下:
2.3合并一个文件夹下所有的tif格式的文件
该功能尤其适合smart3d生产的影像或者地形
示例是合并影像,如果需要合并地形,最后一行的【EXPORT_RASTER】改为【EXPORT_ELEVATION 】,并带上单位【ELEV_UNITS="METERS"】即可
注:最开始没注意,后来发现不带单位的话,默认单位是分米【decimeters】
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//定义输出文件变量
DEFINE_VAR NAME="OUTPUT_FILE" VALUE="D:\GlobalMappper\script_sample_data\result\multi_dom_file_export_result.tif"
//DIR_LOOP_START遍历目录, DIRECTORY目录位置,FILENAME_MASKS过滤遍历的文件格式
//RECURSE_DIR表示是否搜索子目录
DIR_LOOP_START DIRECTORY="D:\GlobalMappper\script_sample_data\multi_dom\" FILENAME_MASKS="*.tif" RECURSE_DIR=YES
//导入搜索到的tif文件
IMPORT FILENAME="%FNAME_W_DIR%"
DIR_LOOP_END
//输出合并后的TIF文件
EXPORT_RASTER FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFF
3.tif影像和地形裁剪脚本
LSV绘制一个用于进行裁剪的面,另存为clip.shp
如需裁剪地形,只需把【EXPORT_RASTER】改为【EXPORT_ELEVATION】,并带上单位【ELEV_UNITS="METERS"】即可
另外,2.2当中的整个目录的遍历形式也可应用,可动手尝试
//影像裁剪
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//定义输出文件变量
DEFINE_VAR NAME="OUTPUT_FILE" VALUE="D:\GlobalMappper\script_sample_data\result\dom_clip.tif"
//导入文件名
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dom1\13\dem范围谷歌影像.tif"
//导出栅格数据
//GEN_WORLD_FILE=YES : EXPORT TWF
EXPORT_RASTER FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFF PALETTE=OPTIMIZED GEN_WORLD_FILE=YES POLYGON_CROP_FILE="D:\GlobalMappper\script_sample_data\clip\clip.shp"
4.tif影像和地形投影转换脚本
投影转换可以指定目标投影的prj文件,也可以通过EPSG代号的方式进行指定
国家2000 三度分带 中央经线108 坐标不含分带:4545
84经纬度坐标系:4326
投影转换方式1:EPSG
//投影转换
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//定义输出文件变量
DEFINE_VAR NAME="OUTPUT_FILE" VALUE="D:\GlobalMappper\script_sample_data\result\dom_project_convert.tif"
//导入文件名
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dom1\13\dem范围谷歌影像.tif"
//通过EPSG参数加载新的全局投影
LOAD_PROJECTION PROJ="EPSG:4545"
//输出新的重投影后的文件
EXPORT_RASTER FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFF
显示的是2000平面坐标
投影转换方式2:prj文件
//投影转换
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//定义输出文件变量
DEFINE_VAR NAME="OUTPUT_FILE" VALUE="D:\GlobalMappper\script_sample_data\result\dom_project_convert_prj.tif"
//导入文件名
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\dom1\13\dem范围谷歌影像.tif"
//从PRJ文件加载新的全局投影
LOAD_PROJECTION FILENAME="D:\GlobalMappper\script_sample_data\script\4545.prj"
//输出新的重投影后的文件
EXPORT_RASTER FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFFGEN_WORLD_FILE=YES
如果需要生产prj或者tfw文件,设置如下参数即可
//输出新的重投影后的文件
EXPORT_RASTER GEN_PRJ_FILE=YES GEN_WORLD_FILE=YES FILENAME="%OUTPUT_FILE%" TYPE=GEOTIFF
5.用面文件对kml进行分隔/裁剪
用西宁市建筑轮廓的shp文件,转为kml(lsv和globalmapper都可以转)
对于面数据,裁剪的时候会自动闭合
//kml裁剪
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//导入kml文件
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\kml\xining_jianzhu_lunkuo.kml" LOAD_FLAGS="0"
//根据shp文件的形状大小裁切后输出kml文件
EXPORT_VECTOR FILENAME="D:\GlobalMappper\script_sample_data\result\kml_clip.kml" TYPE=KML POLYGON_CROP_FILE="D:\GlobalMappper\script_sample_data\clip\clip_xining.shp"
//移除当前加载的所有数据
UNLOAD_ALL
6.kml参数输出csv
丽水市的poi的shp文件,转为kml作为示例数据,13万条记录
kml转CSV
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//导入Kml文件
IMPORT FILENAME="D:\GlobalMappper\script_sample_data\kml\li_shui_shi.kml" LOAD_FLAGS="0"
//通过EXPORT_VECTOR 导出csv文件
//COORD_DELIM表示逗号分割,COORD_ORDER采用WKT中的坐标字符串 ,EXPORT_ATTRS表示属性样式
//EXPORT_HEADER表示头部是否导出,POINTS_ONLY表示是否仅添加点
//USE_COMMA_FOR_DECIMAL 指定是否应使用十进制逗号的欧洲样式,而不是使用句点。
EXPORT_VECTOR FILENAME="D:\GlobalMappper\script_sample_data\result\lishuishi_poi.csv" TYPE=CSV COORD_DELIM=COMMA COORD_ORDER=WKT EXPORT_ATTRS=NO_STYLE EXPORT_HEADER=NO USE_COMMA_FOR_DECIMAL POINTS_ONLY=NO
//移除当前加载的所有数据
UNLOAD_ALL
7.shp文件的投影转换
用法和影像、地形基本一致,不过多介绍
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//加载SHP文件
IMPORT FILENAME="shp/data.shp" LOAD_FLAGS="0"
//通过EPSG参数加载新的全局投影
LOAD_PROJECTION PROJ="EPSG:3857"
//采用EXPORT_VECTOR输出SHP文件
//GEN_PRJ_FILE是否生成投影文件,矢量类型 SHAPE_TYPE
EXPORT_VECTOR GEN_PRJ_FILE=YES FILENAME="output/data.shp" TYPE=SHAPEFILE SHAPE_TYPE=AREAS
//移除当前加载的所有数据
UNLOAD_ALL
8.文件的循环遍历(csv的读取)
脚本示例:(xxx.gms)
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据
UNLOAD_ALL
//调用CMD命令
//RUN_COMMAND COMMAND_LINE="cmd /c del logs\log.txt /f"
//设置日志文件APPEND_TO_FILE表示不追加(NO)或者追加写入(YES)文件
SET_LOG_FILE FILENAME="logs\log.txt" APPEND_TO_FILE=NO
//定义用来查找CSV文件数据的变量表state_codes
DEFINE_VAR_TABLE NAME="state_codes" \
FILENAME="file_003.csv"
END_VAR_TABLE
//从表state_codes中循环读取参数如:id,name
//VAR_NAME表示用户存储当前循环值的变量, 使用方法:%ROW:xxx%
VAR_LOOP_START VALUE_TABLE="state_codes" VAR_NAME="%ROW%"
//记录日志
LOG_MESSAGE %ROW:id% %ROW:name%
VAR_LOOP_END
CSV文件内容:(xxx.csv)
id,name
01,xxx01.tif
02,xxx02.tif
执行结果如下:
扩展:
//也可以通过COMPARE_STR比较值来直接获取单行文件的其它值
DEFINE_VAR NAME="name01" VALUE_TABLE="state_codes" VALUE_COLUMN="name" \
COMPARE_STR="id=01"
LOG_MESSAGE %name01%
9.变量的定义
脚本示例:(xxx.gms)
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//采用DEFINE_VAR来定义变量,NAME变量名,VALUE变量值
DEFINE_VAR NAME="VAR1" VALUE="val2"
DEFINE_VAR NAME="VAR2" VALUE="10"
//记录日志 采用%VAR1%来调用变量
LOG_MESSAGE %VAR1% -- %VAR2%
10.if语句的使用
脚本示例:(xxx.gms)
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//采用DEFINE_VAR来定义变量,NAME变量名,VALUE变量值
DEFINE_VAR NAME="VAR1" VALUE="val2"
DEFINE_VAR NAME="VAR2" VALUE="10"
//通过COMPARE_STR来判断变量%VAR1%的值是否为val1
IF COMPARE_STR="%VAR1%=val1"
IF COMPARE_STR="%VAR2%>10"
LOG_MESSAGE %VAR2% > 10
END_IF
ELSE_IF COMPARE_STR="%VAR1%=val2"
LOG_MESSAGE %VAR1% == val2
ELSE
LOG_MESSAGE %VAR1% != val1
END_IF
11.for循环的应用
脚本示例:(xxx.gms)
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//二级循环:与for循环类似,采用VAR_LOOP_START开始,VAR_LOOP_END结束
//VAL_FORMAT表示将小于10的数值格式化为2位数如:01
//VAR_NAME表示用户存储当前循环值的变量
VAR_LOOP_START VAL_START=1 VAL_STOP=10 VAL_STEP=1 VAL_FORMAT="%02d" VAR_NAME="%ROW%"
VAR_LOOP_START VAL_START=1 VAL_STOP=10 VAL_STEP=1 VAR_NAME="%COL%"
LOG_MESSAGE %ROW% -- %COL%
VAR_LOOP_END
VAR_LOOP_END
12.文件夹下文件的遍历
脚本示例:(xxx.gms)
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//DIR_LOOP_START遍历目录, DIRECTORY目录位置,FILENAME_MASKS过滤遍历的文件格式
//RECURSE_DIR表示是否搜索子目录
DIR_LOOP_START DIRECTORY="shp\" FILENAME_MASKS="*.shp" RECURSE_DIR=NO
//当前文件的完整路径
LOG_MESSAGE %DIR%
//当前文件的完整路径和文件名
LOG_MESSAGE %FNAME_W_DIR%
//当前文件的文件名,不带扩展名
LOG_MESSAGE %FNAME_WO_EXT%
//文件的父目录的名称
LOG_MESSAGE %PARENT_DIR%
//某个父目录级别的名称,其中“N”是级别, %PARENT_DIR1%%PARENT_
DIR2%
LOG_MESSAGE %PARENT_DIRN%
//文件夹递归到原始搜索文件夹之外:C:\ path\to\my\data\sub\folder\my\u file.dem值为'sub\folder'
LOG_MESSAGE %RECURSE_FOLDER%
DIR_LOOP_END
13.多脚本同时执行(参数传递)
脚本示例:(xxx.gms)
//脚本标识头 版本固定1.00 【该行必须存在】
GLOBAL_MAPPER_SCRIPT VERSION=1.00
//移除当前加载的所有数据,%var1%为获取的传参的值
LOG_MESSAGE Get var1 <%var1%>
//导入文件%var1%,即传参data.tif
//ANTI_ALIAS表示是否通过在像素之间进行细调来移除锯齿边
IMPORT FILENAME="%var1%" ANTI_ALIAS=NO
bat文件:
@rem-var1表示传递的变量名称,data表示变量-var1的值
global_mapper.exe xxx.gms -var1 data.tif
14.关联知识点:
14.1投影文件的获取
http://epsg.io
http://spatialreference.org
14.2影像、地形文件的介绍
多数3通道的tif认为是影像,单通道的认为是地形
并不排除部分影像本身就是单波段。