0.概述:
GlobalMapper是一款功能强大的小型化GIS栅格影像、矢量数据处理、加工软件,其本身具备了GIS软件产品的几乎所有特性,做到了将复杂的问题简单化,哪怕你是对GIS一无所知的用户都可以很快的上手,简单直观的功能设计都能够帮助你以最快的速度完成所需要的工作,完成加工数据成品的任务。
界面化的操作,对数据操作之前要先打开数据,大数据的处理,自动化处理极其不便。其脚本可以有效解决这些问题。本文主要基于GlobalMapper的脚本实现对影像、地形、示例数据的大数据脚本话自动操作。
以下所有脚本都是基于GlobalMapperV20实现。
1.数据获取
1.1lsv获得影像数据:
LSV有近千种图源,都可以直接下载为tif格式的影像数据
谷歌影像、谷歌历史影像、ArcGIS影像、天地图影像、微软影像:
**
其他影像数据:
各种道路图
各种地形晕渲图:
各种地质图与地质详图
天地图各种分省图:
各种海图:
各种历史图:
各种气象图:
各种透明图;
各种专题图:
1.2LSV获得的地形数据:
谷歌地形(90米)
ETOP(1.8km地形)
SRTM3 90米地形
Alster30米地形:
Alos12米地形:
5米地形:
1.3快速标绘或者矢量化数据;
1.4本教程示例数据
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
投影转换方式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 【该行必须存在】 GLOBALMAPPER_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认为是影像,单通道的认为是地形
并不排除部分影像本身就是单波段。