ENVI_IDL: 批量制作专题地图

article/2025/3/19 0:34:33

目录

1. 提要

2. 编程 


1. 提要

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

说实话,这个ENVI_IDL的批量制图是真的不好用,看个人吧。另外大量的函数解释需要自己去看help,代码里面我只是简单的解释了一下每个函数的重要参数,如果有其它需要,可以自行查找。

还有,后面的指北针由于idl没有内置,所以需要自己下一个指北针然后贴到图上去。以及比例尺idl也没有自己内置,需要借用colorbar()函数想想办法。

还有一件事就是里面的城市的标签需要自己一个一个去指定位置,费时费力,但是一次弄好了之后循环就不需要老自己弄了。

所以说,前面的格网和colorbar以及字体的相关设置等等已经能够满足大部分需求。

最后,保存可以自己挑选合适的图片格式,如png、tiff、svg等等

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 

2. 编程 

pro week_eleven_study1; 如何批量制图; tiff文件的路径tiff_dir = 'D:/IDL_program/experiment_data/chapter_6/TROPOMI_NO2/'; 获取所有tiff文件的路径tiff_path_list = file_search(tiff_dir, '*.tiff', count=tiff_count); 获取所有tiff文件的名称tiff_name_list = file_basename(tiff_path_list, '.tiff'); 获取shp文件的路径china_path = 'D:/IDL_program/experiment_data/chapter_6/shp_file/china_province.shp'sichuan_path = 'D:/IDL_program/experiment_data/chapter_6/shp_file/Sichuan_city_wgs84.shp'; 据说使用beijing54坐标系有时会出现无法识别的现象,所以这里的shp文件是wgs84坐标系的; 循环制图for tiff_i = 0, tiff_count - 1 do begin; 获取该循环下的tiff文件的数据以及地理信息data = read_tiff(tiff_path_list[tiff_i], geotiff=geo_info); 输出路径out_path = tiff_dir + tiff_name_list[tiff_i] + '.png'; 获取data的sizedata_size = size(data); 获取数据的行列数data_col = data_size[1]data_row = data_size[2]; 获取图像数据的分辨率resolution = geo_info.(0)resolution_x = resolution[0]resolution_y = resolution[1]; 获取图像数据的角点信息geo_loc = geo_info.(1); 最大最小经纬度lon_min = geo_loc[3]lat_max = geo_loc[4]lon_max = lon_min + data_col * resolution_xlat_min = lat_max - data_row * resolution_y; 制图——》主要是image函数(我的意见是多看help)im = image($; 为了方便解释,我会分行写代码并解释; 首先传入制图需要的主体数据data,$$  ; 然后由于图像是黑白但是有灰度值,所以这里我们给他整个彩色rgb_table=22,$  ; 你可以写颜色渐变的代号(help里面有),也可以直接传入颜色字符串(譬如'red'); 但是你可以发现这个颜色渐变有点离谱的那种感觉,所以你可能会想到去2%线性拉伸; 但是没有必要,image()函数内置了min_value和max_value供您集中颜色min_value=0.0, max_value=0.002,$  ; 这些最大最小基于你自己在arcgis抑或envi查看得到(当然你可以写代码按某种2%的规则寻找); 由于我们的image函数是从下往上绘制图像,所以我们得到的图像是颠倒的,所以需要纠正/order,$; 投影信息map_projection='Geographic',$  ; 你知道你的投影是什么之后去help查看输入即可; 除此之外,你还应该告诉函数你的投影信息的单位是什么grid_units='degrees',$  ; 当然你也可以输入代号2(具体查看help); 但是只有上面的信息是不够的,函数不知道我们数据的地理位置,就算知道了投影也不知道把图片放在哪里; 所以还需要告诉函数图像数据的位置(其实是告诉函数左下角点的经纬度)image_location=[lon_min, lat_min],$; 另外,你还需要告诉函数x、y方向上跨越的经纬度度数(或者说是图像的尺寸)image_dimension=[lon_max - lon_min, lat_max - lat_min],$  ; 宽度和高度; 上面是设置图像的大小尺寸,现在图像是要放在一个窗口中显示的,所以这里还需要设置一下窗口的大小(当然你不设置也是有默认的参数)dimension=[1000, 1000],$; 另外有时候我们不需要那么大的图像显示在窗口中,那么我们可以通过输入最大最小经纬度限制显示的范围(这里我们设定只需要四川范围)limit=[25, 97.0, 35.0, 109.0],$  ; [Latmin, Lonmin, Latmax, Lonmax]; 可能你现在会觉得四川范围的图像在窗口中显示的太小了,需要将图像在窗口中显示的大一些position=[0.05, 0.05, 0.95, 0.95])  ; [左下角点x、左下角点y、右上角点x、右上角点y]; 这里传入的是图像左下角点和右上角点的坐标,这个坐标是图像的经纬度坐标,而是基于整个窗口的坐标,以窗口左下角点为(0, 0),右上角点为(1, 1); 那么去设置图像的左下角点和右上角点的坐标,就可以确定整幅图像在窗口的显示大小以及位置了; 另外你可能会疑惑,我的图像长宽不是1:1,那么上面这样子会不会做拉伸处理,是不会的,函数会基于你给定的位置尽量靠近这个位置并放大,但是不会拉伸; 现在设置好了image参数,可以往里面添加一些shp文件(不然孤零零的在那里一张图谁知道那地方是哪里啊)m1 = mapcontinents(china_path, color='black', linestyle='-:', thick=0.8)  ; 传入shp文件的路径(必须); 当然你也可以设置线的颜色color(不设置默认黑色)、线的样式linestyle(默认细实线)、设置线的厚度thick(当然还有一些其它的参数这里就不再一一介绍)m2 = mapcontinents(sichuan_path, color='black', linestyle='-', thick=1.8); 由于上面position我们知道函数是尽量在我们设置的位置放置图像,但是为了后续加上坐标轴之类的,那么我们就需要图像在窗口中的坐标位置了true_position = im.positionposition_dl_x = true_position[0]position_dl_y = true_position[1]position_ur_x = true_position[2]position_ur_y = true_position[3]; 标题的相关设置; 标题名称im.title = 'TROPOMI NO$_2$  result  over  Sichuan area'  ; 其中$$中间表示对其中的字符串进行特殊操作,这里_表示2是下标; 标题的字体im.title.font_name = 'palatino'  ; 字体有哪些可以去help搜索font即可得到答案; 字体的大小im.title.font_size = 16  ; 这个自己多试几下就知道字的大小了; 字体颜色im.title.font_color = 'black'  ; 这里既可以传入颜色字符串,也可以传入RGB三个数字(以数组形式),更可以传入颜色的代称(但是不是1、2诸如此类,而是#加一些数字,具体代表什么颜色看help); 字体的粗细im.title.font_style = 3  ; 表示粗体(0-正常\2-斜体\3-斜粗体),另外也可以传入字符串达到相同的效果,具体看help; 格网的相关设置; 格网对象设置(其实前面标题也是可以这样设置,如果你学过诸如python之类面向对象语言,那么相信这是很容易理解的)grid = im.mapgrid; 我们看图片可以发现,经纬度显示在格网的线上,而不是在图的侧边,为了我们的视觉习惯,我们可以更改grid.label_position = 0  ; 其实这里你可以设置[0,1](闭区间)、0表示最靠左最靠下,1表示最靠右最靠上,处于中间按比例靠近; 因为这里有每一条经纬线的标签,所以也是可以有字体的相关设置的grid.font_name = 'schoolbook'  ; 我随便在help挑的一种字体grid.font_size = 8  ; 这个在轴上显示的应该比上面的title下一点才是
;    grid.font_color = 'black'  ; 我只是告诉大家这个也是有的,都是相通的,其实不写默认也是黑色的(我错了,这个是没有的,所以大家要多多尝试,勇于犯错)grid.font_style = 'bi'  ; 这里是告诉,上面可以使用1、2类似的数字,这里使用字符串也是可以达到相同的效果(bi是粗体斜体); 设置格网线的样式(我们觉得这个格网线是实线有点喧宾夺主,所以换成虚线会比较好一点)grid.linestyle = '-.'  ; __表示虚线,其它还有一些表示可以自行查看·help; 对于格网的最外边的一圈线,我们觉得粗细不对,应该再设置的粗一点,不应当和里面的线是虚线而且那么细grid.horizon_thick = 2  ; 我们如果设置了这个那么会将horizon line(最外圈的线)更改为实线,如果你还有修改horizon line的需求,可以指定grid.horizon_linestyle; 得到经度标签的对象lons = grid.longitudeslats = grid.latitudes; 我们的x轴的标签是竖着的,我们希望是横着的(由于lons是对象类型的数组,里面是每一个标签对象,所以需要循环)for lon_i = 0, n_elements(lons) - 1 do lons[lon_i].label_angle = 0.0  ; 旋转角度是0表示没有旋转就是横着的for lat_i = 0, n_elements(lats) - 1 do lats[lat_i].label_angle = 90.0  ; 另外我们希望y轴的标签是竖着的,所以旋转角度是90°; 另外我们发现在原点处的标签重合了,所以我们需要再设置一下标签的对齐方式(默认是居中对齐)(其实这个可以写到上面循环中去)for lon_i = 0, n_elements(lons) - 1 do lons[lon_i].label_align = 0.0  ; 0.0表示左对齐,0.5表示中间对齐,1.0表示右对齐,其它0-1的数字按比例对齐for lat_i = 0, n_elements(lats) - 1 do lats[lat_i].label_align = 0.0; 然后还有就是x轴和y轴最后一个表示经纬度的标签有点多余,我们需要将其隐藏lons[-1].label_show = 0  ; 0表示隐藏lats[-1].label_show = 0  ; -1表示最后一个数字; 另外我们希望在指定的位置写上地名之类的东西,那么这个在idl是比较麻烦的,好像目前没有别的办法; 这里解释第一个:首先传入经纬度(先x轴坐标再y轴坐标,然后传入需要填写的值,在之后传入填写的位置,在后面的参数就是微调)t=text(103.3d,30.46d,'Chengdu',/data,$font_name='Palatino',font_size=12, font_style=1)  ; 省会城市我们让其粗体好了t=text(101.8d,31.8d,'Aba',/data,$font_name='Palatino',font_size=12)t=text(100.1d,31.5d,'Ganzi',/data,$font_name='Palatino',font_size=12)t=text(101.6d,27.65d,'Liangshan',/data,$font_name='Palatino',font_size=12)t=text(101.1d,26.7d,'Panzhihua',/data,$font_name='Palatino',font_size=12)t=text(102.5d,29.8d,'Yaan',/data,$font_name='Palatino',font_size=12)t=text(104.0d,30.93d,'Deyang',/data,$font_name='Palatino',font_size=12)t=text(104.1d,31.6d,'Mianyang',/data,$font_name='Palatino',font_size=12)t=text(105.2d,28.65d,'Luzhou',/data,$font_name='Palatino',font_size=12)t=text(103.4d,29.8d,'Meishan',/data,$font_name='Palatino',font_size=12)t=text(104.75d,30.05d,'Ziyang',/data,$font_name='Palatino',font_size=12)t=text(104.5d,29.7d,'Neijiang',/data,$font_name='Palatino',font_size=12)t=text(104.3d,29.15d,'Zigong',/data,$font_name='Palatino',font_size=12)t=text(104.4d,28.5d,'Yibin',/data,$font_name='Palatino',font_size=12)t=text(105.0d,30.6d,'Suining',/data,$font_name='Palatino',font_size=12)t=text(105.7d,30.88d,'Nanchong',/data,$font_name='Palatino',font_size=12)t=text(107.2d,31.3d,'Dazhou',/data,$font_name='Palatino',font_size=12)t=text(106.1d,30.25d,'Guangan',/data,$font_name='Palatino',font_size=12)t=text(106.5d,31.95d,'Bazhong',/data,$font_name='Palatino',font_size=12)t=text(105.3d,32.2d,'Guangyuan',/data,$font_name='Palatino',font_size=12)t=text(103.4d,29.3d,'Leshan',/data,$font_name='Palatino',font_size=12); 另外还有城市的symbol,图形符号也搞一个(当然,这个也是费时费力)s=symbol(104.06d,30.67d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=2)  ; 成都的符号就粗一点把s=symbol(101.72d,31.93d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(99.96d,31.64d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(102.27d,27.90d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(101.72d,26.58d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(103.00d,29.98d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(104.38d,31.13d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(104.73d,31.47d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(105.43d,28.87d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(103.83d,30.05d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(104.65d,30.12d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(105.05d,29.58d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(104.78d,29.35d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(104.62d,28.77d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(105.57d,30.52d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(106.08d,30.78d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(107.50d,31.22d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(106.63d,30.47d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(106.77d,31.85d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(105.83d,32.43d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5)s=symbol(103.77d,29.57d,'circle',/data,$sym_size=0.5,sym_color='black',sym_thick=1.5); 现在图还缺一点什么呢?对了,还有图例没有cb = colorbar(/data, target=im); 由于空间有限,所以我们需要将图标移动到左下角的位置(上面colorbar函数默认显示在图的正底下)cb.position = [position_dl_x + 0.5, position_dl_y - 0.07, position_ur_x, 0.09]  ; 这个需要自己慢慢调; 另外图例的数字位数太多,也需要调整一下cb.range = [0.00, 1.00]; 做好了图标总要告诉人家这个图标是什么吧?还缺个标题或者说是单位,我们前面将0.001改为了1.0,所以要有标题提醒10^-3cb.title = 'NO$_2$ ($\times$10$^{-3}$ mol / m$^2$)'  ; ✖是特殊符号,help里面有对应的写法,这里\times表示乘号cb.font_style = 2  ; 设置为斜体; 另外还有城市图标那个图例没有弄s=symbol(position_dl_x+0.2,position_dl_y-0.07,'circle',target=im,$sym_size=0.6,sym_color='black',sym_thick=1.5)t=text(position_dl_x+0.21,position_dl_y-0.07,'City center',target=im,$font_name='Palatino',font_size=12); 保存图片im.save, out_path; 关闭弹出的图片im.closeprintendfor
end

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

这是运行结果:

这是循环得到的三张图片:
 

 

分辨率还是非常高的:

 

这是其中一张图片:


 

 

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

 

我是炒茄子,不用谢·1


http://chatgpt.dhexx.cn/article/UBxHvE7n.shtml

相关文章

专题地图制作之POI获取

制图的POI点采集 专题地图POI的获取 专题地图 说到专题地图,相信地信遥感专业的并不陌生,但制作专题地图可能最头疼的不是用软件(ArcGIS,MapGIS),而是POI点的获取: 比如我们要制作下图所示医院…

专题地图的制作

专题地图的制作 1.布局纸张的设置 ①模板 (1)在ArcMap窗口主菜单栏,点击“文件”,“新建”里的“新建文档” 点击“模板”,可以用系统本身带有的模板 也可以选择我的模板,用空白模板,根据自己的需要进行…

用ArcGIS制作专题地图

在习惯用SuperMap制作专题地图后,以为用ArcGIS制图分不方便的我,今天发现是非常错误的,原来ArcGIS也很方便! 废话不多说,开始把 先上结果图 将图形符号化之后,我们便可以新建布局,添加地图了。…

ArcGIS实验教程——实验二十三:专题地图制作完整实验步骤

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 专题地图是一个非常复杂的过程,地图数据的符号化与注记标注,都是地图编制准备基础的地理数据。然而,要将准备好的地图数据,通过一幅完整的地图表达出来,还有很多工作,包括布局…

【专题地图编制设计与制作】

地图编制设计书 1.专题地图编制设计(1)图名、比例尺、地图目的、用途和编制原则与要求(2)地图投影与图面配置(3)编图资料的分析评价和利用处理方案(4)地图内容、指标,表示…

地图学:专题地图制作详细步骤

使用软件:ArcGIS 1.加载数据以及基本数据处理 【1】点击,选择文件所在路径,加载全国县级数据以及全国行政区(具体步骤如下) 加载好的数据如下: 【2】裁剪江西省 (2.1)点击选择江西省要素&…

专题地图制作(设计、规划、测绘制作图斑)标绘使用详解

专题地图制作(设计、规划、测绘制作图斑)标绘使用详解 同步视频教程:http://www.iqiyi.com/w_19rvgy9jux.html 1、导入/导出AutoCAD文件DXF格式 2、在线标注含有 点 线 面 的矢量标注(KML/KMZ/SHP/DWG/DXF) 3、标注矢…

交换机的原理

一、交换机的类型 1、接入交换机:位于接入层(通常将网络中直接面向用户连接或访问网络中的部分称为接入层),主要提供终端设备的介入,比如PC、打印机等等。一般来说,接入交换机都是盒式设备(TOR&…

PHP实现免费代理池

PHP实现免费代理池 声明背景设计源码使用 声明 本项目所有代理IP均采集于网络,请勿用于非法途径,违者后果自负! 背景 最近疯狂爬虫,请求频繁经常触发网站的反爬策略,加代理是比较简单的方法,起初购买网上…

python爬虫案例-爬取西刺免费代理服务器IP等信息

全栈工程师开发手册 (作者:栾鹏) python教程全解 在使用python爬取网络数据时,网络需要设置代理服务器,防止目标网站对IP的限制。 http://www.xicidaili.com/ 网站实现了众多可以使用的代理服务器,这里写了…

python网络爬虫实战——实时抓取西刺免费代理ip

参考网上高手示例程序,利用了多线程技术,Python版本为2.7 #-*-coding:utf8-*-import urllib2 import re import threading import timerawProxyList [] checkedProxyList []#抓取代理网站 targets[] for i in range(1,6):target r"http://www.xi…

十五个免费Windows桌面系统工具(附下载)

工欲善其事,必先利其器。有些人喜欢以量取胜,通过收集海量Windows工具帮助自己完成日常业务。不过对于大多数人来说,“实用”二字最为关键。如果收集来的软件一周用不上几次,无疑我们很难将其视为“实用”工具中的佼佼者。 实用工…

Linux工具参考篇(网摘)

Linux工具参考篇 原文出处:【Linux Tools Quick Tutorial】 1. gdb 调试利器2. ldd 查看程序依赖库3. lsof 一切皆文件4. ps 进程查看器5. pstack 跟踪进程栈6. strace 跟踪进程中的系统调用7. ipcs 查询进程间通信状态8. top linux下的任务管理器9. free 查询可用内…

ADB的使用-简单命令

今天记录的是 Android Debug Bridge,安卓debug调试桥,它是一款测试/开发人员必不可少的利器。作为一名测试人员,今天主要了解它在测试中简单的应用命令。 ADB是一个C/S架构(默认端口号为:5037),…

成为一名二进制分析师需要用到的Linux二进制分析工具有哪些?

在本文中,你将学习在Linux操作系统上进行分析所需的基本工具。 除了向你简单展示工具列表,并解释它们的功能以外,我还将使用“夺旗”(Capture The Flag,CTF)挑战来说明它们的工作原理。在计算机安全与黑客…

java面试大全(7w字,更新中)

1.杂题 1.maven依赖冲突的解决方法 依赖冲突的原因 举个例子,A依赖于B与C,B依赖于D的1.0版本,C依赖于D的2.0版本,这就导致加载的时候到底会引入那个版本的jar包的问题 解决方法: 1.用idea提供的MavenHelper查看是哪个依赖冲突…

Redis入门学习笔记--附Redis工具类

阅读全文大概得花3个小时时间 Redis入门 概述 Redis是什么 Redis:REmote DIctionary Server 是完全开源免费的,用C语言编写的,遵循BSD协议,是一个高性能的(Key/Value)分布式内存数据库,基于内…

mysql性能分析工具_MySQL性能分析、及调优工具使用详解

本文汇总了MySQL DBA日常工作中用到的些工具,方便初学者,也便于自己查阅。 先介绍下基础设施(CPU、IO、网络等)检查的工具: vmstat、sar(sysstat工具包)、mpstat、oprofile、nicstat、dstat、iotop、tsar、iostat 掌握几个即可,功…

3种方法删除7-Zip压缩包的密码

7-Zip压缩软件是一款完全免费且开源的软件,不仅能压缩和解压7-Zip压缩包,还能给压缩包设置打开密码。 有些小伙伴可能会遇到这样的问题,7-Zip压缩包设置密码后,过了一段时间不需要密码保护了,或者一不小心忘记了密码&…

人大金仓数据库软件下载

作为国产数据库的头部企业,人大金仓的数据库基于开源数据库PostgreSQL开发而成,具有较好的性能及使用体验。这里先来一段人大金仓对自己产品的描述: 人大金仓致力于打造最便捷的国产化替代方案,最可靠、最智能的数据库产品服务&am…