JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

这篇具有很好参考价值的文章主要介绍了JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

一、Matplot3D for JAVA V4.0 概述

二、什么是处理器

三、DataGridProcessor处理器

四、基本使用方法

五、举个栗子:绘制高程地形图


JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解


一、Matplot3D for JAVA V4.0 概述

    Matplot3D for JAVA  是一个基于JAVA SE 1.8环境开发的数学科学数据三维可视化组件。 这是一个纯JAVA实现的类似matplotlib可视化三维库(内含纯java实现的3维软引擎),封装为一个jar包,jar文件大小只有200多KB,直接引用即可。无需再安装和配置第三方库或者环境,无需依赖OpenGL、DriectX、JAVA 3D或JAVAFX等等。

下载地址 

码云:        https://gitee.com/tanling8334/Matplot3D-for-Java

Github:    https://github.com/tanling8334/Matplot3D-for-Java


二、什么是处理器

    Matplot3D for JAVA 的处理器(Processor)是一类对象,它们的作用是将数据转换成对应图表的三维模型,负责数据处理和建模,无需使用者直接编写具体模型的代码,只需要将数据加入到处理器中,再通过Matplot3D4JMgr对象将图表直接在绘制到界面上或者输出为图像文件即可。一个Matplot3D4JMgr对象可以“持有”多个不同类型的处理器对象。


三、DataGridProcessor处理器

    DataGridProcessor是数据网格处理器,可以绘制连续的曲面。数据网格是指一个在x,y方向都均匀排列的点阵列。使用一个Double[][]表示数据,数组中的值为z(高度)值。x,y方向由于均匀分布,在指定了各自的取值范围后即可换算为空间坐标的x,y坐标。需要注意的是Double[][]中存放的为数据,和显示的分段数不一定相等(譬如说数据数组是100*100的,但3维曲面模型的分段数可以使90*80)。


四、基本使用方法

DataGridProcessor的编程模式如下:

DataGridProcessor processor = new DataGridProcessor();  //创建一个数据处理器

Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);	//创建图形管理器

Double[][] datas=new Double[20][20]; //数据阵列

//......准备数据

//向pricessor对象加入数据
processor.addData(datas, "Name", new Range(0, 300), new Range(0, 300), 100, 100, cs, 1f);

mgr.show();

    其中datas表示用户的数据,上面的代码中并没有数据。 现生成一些演示数据如下:

    DataGridProcessor processor = new DataGridProcessor();
		
    Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);		
		
    //----------以下生成一些演示数据
    Double[][] datas=new Double[20][20];
		
    Random random=new Random();
		
    for(int i=0;i<datas.length;i++) {
	    for(int j=0;j<datas[0].length;j++) {
				
		    if(i+j<20)
			    datas[i][j]=(double)i+j+random.nextDouble();
		    else 
			    datas[i][j]=40d-i-j-random.nextDouble();
				
	    }
	}

	processor.setClose3DObject(true); //设置是否是封闭三维对象

	mgr.setScaleZ(1.2); //z方向伸拉至原始的1.2倍

	mgr.setTitle("Demo 数据阵列");

	processor.setShowGrid(false);//不显示辅助网格线


    //创建一个颜色风格
	ColorStyle cs = new TopBottomColorStyle(ColorStyle.DEFAULT_COLORS_ARRAY);

	processor.addData(datas, "", new Range(0, 100), new Range(100, 200), 20, 20, cs, 1f);
		
	mgr.show();

    运行效果如下:

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

主要方法介绍:

public void setClose3DObject(boolean flag)

设置是否封闭三维对象,如果为false则只显示数据曲面,如果为true则将曲面、和自适应的水平的矩形平面和四周的垂直面将三维图形围蔽。

public void addData(Double[][] data, String name, Color color, Range rangeX, Range rangeY, int  stepX, int stepY, float alpha)

加入一组数据阵列数据,并指定x,y范围,显示分段,颜色和不透明度。参数说明如下:

1、data:数据阵列二维数组,第一个下标代表X方向,第二个下标代表Y方向;

2、name:名字;

3、color:颜色;

4、rangeX:数据在X方向的分布范围;

5、rangeY:数据在Y方向的分布范围;

6、stepX :X方向的显示分段;

7、stepY:Y方向的显示分段;

8、alpha:不透明度(0为完全透明,1.0为完全不透明)。

public void addData(Double[][] data, String name, Range rangeX, Range rangeY, int stepX, int stepY, ColorStyle cs, float alpha)

此方法与前一个方法类似,只是使用ColorStyle 最为参填充而不是用一种纯色填充。注意参数的顺序是和上面的方法不一样的。


五、举个栗子:绘制高程地形图

     现在我们来写一个稍微高级一点点的栗子:绘制高程地形图。就像下面这样:

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

     是不是看起来还挺酷的,实际上DataGridProcessord的使用方法和上面简单的栗子并没有多少差别,差别在于数据。同时根据数据的分布密度设置合理的分段数进行建模和绘制。

    需要特别指出的是,由于这是一个JAVA纯软件实现的三维引擎,完全依靠JVM和CPU运算以及靠内存存储数据,当模型数据过多时会占用较多内存,“刷新时”也会占用较多CPU时间。所以根据自己电脑的实际配置和性能来决定模型的精细度。根据我的4年前的破电脑的使用经验,如果是需要实时刷新我觉得最好把模型的片面数控制在10W个以内,例如分段数设定为300*300时,模型的片面数就会超过9W个。大家可以根据自己电脑的实际配置测试一下在可接受的刷新效率下的极限精细度。

    关于性能方面的底层问题,我还在还在持续改进中,看看使用CPU计算时JAVA的极限能达到什么程度。

    言归正传,地形数据怎么生成。首先从互联网上找到高程数据,高程数据一般都是测绘卫星测绘获得的,有多种格式,大家有兴趣可以研究研究。我是从下面这个网站下载高程数据的:

http://viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

    选择某一个方格可以下载那一区域的高程数据,下载后解压可以得到一堆后缀是 .hgt的文件。文件是以一个方格区域的右上角的经纬度命名的,每个文件代表的方格跨度分别是经度的1度和纬度的1度。例如N08E036.hgt文件包含的就是北纬8度到北纬9度,东经36度到东经37度这一区域的地形高程数据。每个文件的大小是一致的,共包含1442401个采样点的高程数据,可以看到每个文件的大小是2884802字节,就是说每个采样点数据占用了两个字节。

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

    同时可以按照地球的半径换算:​,结果大约是90m,也就是说这些hgt文件的数据精度是90米。每一个文件涵盖的区域长宽大概是108km,而我们知道地球最高的海拔也只有8800多米,所以整块绘制体现不出地形高度起伏,可以只提取其中的一个子区域绘制。

    例如提取文件“ N27E086.hgt ” 文件其中300*300个点表示的区域进行绘制。这个区域位于喜马拉雅山脉,因此地形起伏会比较明显。  

    hgt文件数据提取代码如下:

/**
* @param fileName 文件名
* @param offsetU  提取区域右上角的经度偏移量
* @param offsetV  提取区域右上角的维度偏移量
* @param countU   经度提取点数量
* @param countV   维度提取点数量
* @return         高程数据数组
*/
Double[][] readHgtFile(String fileName,int offsetU,int offsetV,int countU,int countV) throws Exception{
		
	File file = new File(fileName);
		
	DataInputStream dio = new DataInputStream(new FileInputStream(file));
		
	int x=0,y=0;
	Double[][] datas=new Double[countU][countV];
	byte[] buf=new byte[2402];
		
	for(int i=0;i<1201;i++) {
			
		dio.read(buf);
			
		if(i<offsetU||i>=offsetU+countU)
			continue;
			
		for(int k=0;k<buf.length;k+=2) {
				
			if(k/2<offsetV||k/2>=offsetV+countV)
				continue;
				
			datas[x][y]=(double)((buf[k] << 8) | (buf[k+1] & 0xff));
			y++;
		}
			
		y=0;
		x++;
	}
		
	dio.close();
		
	return datas;
}

    接下来是主程序,因为我们需要取纵横300个点,按照点间90米计算,跨度大约为27公里,因此绘图范围的跨度应该设置为27000,分段数可随意,这里设置为270,使片面数不至于很大。主程序如下:

	public static void main(String[] args) throws Exception {

		final Double[][] datas = readHgtFile("./demo_data/N27E086.hgt",139,100,301,300);

		DataGridProcessor processor = new DataGridProcessor();
		
		Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);

		mgr.setTitle("高程地形");
		mgr.setShowReferencePlanes(false); //不显示坐标系

		processor.setShowGrid(false); //不显示网格线

		processor.addData(datas, "",Color.LIGHT_GRAY, new Range(0, 27000), new Range(0, 27000), 270, 270, 1f);
		
		processor.setClose3DObject(true);
		
		mgr.show();
	}

执行程序显示如图:

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

    是不是已经有点意思了。但是颜色只有灰色,我们希望可以根据高度显示不同的颜色,就是高度用颜色也能体现出来。 还有高光感看起来感觉有一点像金属表面。那么就做一下细节调整。用颜色数组创建ColorStyle对象,并在添加数据时设置,同时关闭高光渲染。调整代码调整如下: 

ColorStyle cs = new TopBottomColorStyle(new Color[] {Color.BLUE,Color.GREEN,Color.YELLOW,Color.RED.brighter(),Color.RED.darker()});

processor.addData(datas, "", new Range(0, 27000), new Range(0, 27000), 270, 270, cs, 1f);

processor.setHighlight(false);
		

    注意使用ColorStyle的 addData 方法的参数顺序和使用Color作为参数的方法是不一样的,效果如下:

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

 关闭高光渲染时效果如下:

JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解

    是不是挺酷文章来源地址https://www.toymoban.com/news/detail-421410.html

到了这里,关于JAVA 如何绘制三维地形图 —— Matplot3D for java V4.0教程:DataGridProcessor处理器详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据可视化——用python绘制气泡图、三维散点图、多重柱形图案例

    目录 前言 一、气泡图的绘制 1、什么是气泡图?他适用于什么数据? 2、图形效果展示 3、导入需要用到的库 4、读取要分析的数据 5、检查数据是否有问题 6、将要对比数据提取出来 7、画图 二、三维散点图的绘制 1、什么是三维散点图? 2、导入需要用到的数据库 3、画图 三

    2024年02月06日
    浏览(53)
  • 【Python】如何使用matlibplot绘制3D柱形图

    (1)构造需要显示的数据 如下图所示,X坐标取值为[0,1,2,3,4],Y坐标取值为[0,1,2,3,4,5,6,7,8],每一个(X,Y)组合的值Z=X+Y,所需要绘制的图就是在X,Y所对应的坐标位置上面根据Z的值来绘制柱形图。 (2)坐标设置 将坐标网格化, X=[0,1,2,3,4],Y=[0,1,2,3,4,5,6,7,8]网格化的结果,如下图

    2024年02月16日
    浏览(25)
  • unity如何绘制地形

    unity如何绘制地形?Unity的地形是由一个特殊的组件称为Terrain来创建的。这个组件可以让你在Unity中创建非常复杂的地形,包括山脉、山谷、河流、湖泊等等。 在Unity中创建地形非常简单,只需要在场景中创建一个空对象,然后在Inspector面板中点击“Add Component”,选择“Terr

    2024年02月09日
    浏览(29)
  • Pyecharts绘制图表大全——柱形图

    说明:本文代码资料等来源于Pyecharts官网,进行了一些重要节点的备注说明梳理,便于学习。 今日学习柱形图! 目录 百分比柱形图  x轴标签旋转  堆叠数据  动态宏观经济指标图  通过 dict 进行配置柱形图  区域选择组件配置项  区域缩放配置项  好全的工具箱!  类似于

    2024年02月05日
    浏览(46)
  • python绘制柱形图系列

    Python版本为:3.7.1;图表绘制包matplotlib、Seaborn、plotnine的版本分别为:2.2.3、0.9.0、0.5.1;数据处理包NumPy和Pandas的版本分别为:1.15.4和0.23.4。

    2024年02月08日
    浏览(28)
  • 【Python】Python中使用Matplotlib绘制折线图、散点图、饼形图、柱形图和箱线图

    python数据可视化课程,实验二 Matplotlib 中文API:API 概览 | Matplotlib 一、实验任务的数据背景 提供的源数据(数据文件employee.csv)共拥有4个特征,分别为就业人员、第一产业就业人员、第二产业就业人员、第三产业就业人员。根据3个产业就业人员的数量绘制散点图和折线图。

    2023年04月15日
    浏览(71)
  • Matplotlib可视化数据分析图表下(常用图表的绘制、折线图、柱形图、直方图、饼形图、散点图、面积图、热力图、箱形图、3D图表、绘制多个图表、双y轴可视化图表、颜色渐变图)

    本文来自《Python数据分析从入门到精通》_明日科技编著 本节介绍常用图表的绘制,主要包括绘制折线图、绘制柱形图、绘制直方图、绘制饼形图、绘制散点图、绘制面积图、绘制热力图、绘制箱型图、绘制3D图表、绘制多个子图表以及图表的保存。对于常用的图表类型以绘制

    2023年04月23日
    浏览(37)
  • G6绘制树形图(自定义节点、自定义边、自定义布局)

    在 registerNode 中定义所有的节点 为了使用内置的布局方式,选择参数为 ‘tree-node’ 树节点类型,数据格式可以存在children子节点,效果自动生成子树 cfg 可以拿到数据,如cfg.id、cfg.name 使用 group.addShape(‘rect’, {}) 定义节点 rect 配置参数:https://antv-g6.gitee.io/zh/docs/api/shapeProp

    2024年02月05日
    浏览(27)
  • Unity制作一个地形,下载地形资源、绘制地形,添加树、草,草可摆动

    选择了Terrain Tools,添加至我的资源 在unity中打开 菜单栏  窗口 包管理器,找到已经获取的资源 下载并导入 全选、导入  方法二: 导入已经下载过的资源 (.unitypackage:Unity package file) 资源菜单 - 导入/项目视图 - 资源 - 右键 - 导入/直接拖拽进项目视图 - 资源 打开下载的资

    2024年01月22日
    浏览(31)
  • 第五章. 可视化数据分析图表—常用图表的绘制4—箱形图,3D图表

    第五章. 可视化数据分析图 本节主要介绍常用图表的绘制,主要包括箱形图,3D柱形图,3D曲面图。 ·箱形图又称箱线图、盒须图或盒式图 ·用于显示一组数据分散情况的统计图 ·优点:不受异常值的影响,可以以一种相对稳定的方式描述数据的离散分布情况,也常用于异常值

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包