当前位置: 首页 > article >正文

Shapefile格式文件解析和显示

Java实现GIS SHP文件格式的解析和显示,JDK19下编译,awt图形系统显示。

SHP文件对应的属性存储在DBF格式数据库中,解析见:DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客

解析SHP文件代码:

	public static Shapefile parse(String file) throws IOException {
		byte _bytes[] = Files.readAllBytes(Paths.get(file));	// 读取文件内容
		BinaryBufferArray bis = new BinaryBufferArray(_bytes, ByteOrder.BIG_ENDIAN); // 设置大端模式
			
		ShapefileImpl shp = new ShapefileImpl();
		
		shp.magic = bis.ReadUInt32();	// 读取标志
		bis.ReadInt32();
		bis.ReadInt32();
		bis.ReadInt32();
		bis.ReadInt32();
		bis.ReadInt32();
		shp.length = bis.ReadUInt32();	// 读取长度
		bis.SetByteOrder(ByteOrder.LITTLE_ENDIAN); // 切换小端模式
		shp.version = bis.ReadUInt32();	// 读取版本号
		shp.type = bis.ReadInt32();
		shp.mbr = bis.ReadDouble(4);
		shp.z = bis.ReadDouble(2);
		shp.m = bis.ReadDouble(2);

		while (bis.available() > 0) {
			bis.SetByteOrder(ByteOrder.BIG_ENDIAN); // 切换大端模式
			int gno = bis.ReadInt32();
			long glen = bis.ReadUInt32();	// 按16-bit word为1个内容长度,这样内容长度是16bit为单位计算的
				
			bis.SetByteOrder(ByteOrder.LITTLE_ENDIAN); 	// 切换小端模式
			long gtype = bis.ReadUInt32();	// 图形类型
			
			if (gtype == 5) {  // Polygon	// 测试文件仅有多边形,程序只实现了多边形
				double[] box = bis.ReadDouble(4);
				int NumParts = bis.ReadInt32();	
				int NumPoints = bis.ReadInt32();
				int[] Parts = bis.ReadInt32(NumParts);
						
				ArrayList<SHPPolygon> ps = new ArrayList<>();	// 多边形存储列表
				for (int i=0; i<NumParts; i++) {
					int n =  (i==NumParts-1 ? NumPoints- Parts[i] : Parts[i+1] - Parts[i] );
					
					SHPPoint[] _points = new SHPPoint[n];
					
					for (int j=0;j<n;j++)
						_points[j] = new SHPPoint(bis.ReadDouble(), bis.ReadDouble());
					
					SHPPolygon p = new SHPPolygon(_points);
					ps.add(p);
				}
				
				SHPPolygonArray p = new SHPPolygonArray(gno, box, ps);
				shp.geos.add(p);
			}
			else 
				throw new java.lang.UnsupportedOperationException("" + gtype);
				
		}
		
		return shp;
	}

使用AWT显示世界地图绘制结果,未采用双缓冲模式有闪烁,当鼠标移动时在状态栏显示国家地名属性,从DBF文件解析获得


http://www.kler.cn/a/538285.html

相关文章:

  • git命令行删除远程分支、删除远程提交日志
  • 信息科技伦理与道德3-2:智能决策
  • mysql 主从配置
  • 什么是中间件中间件有哪些
  • vscode设置保存时自动缩进和格式化
  • 【Nginx + Keepalived 实现高可用的负载均衡架构】
  • Ubuntu系统apt镜像源报错解决思路
  • Python 实现 gRPC 与 原始 RPC 的对比:理解 RPC 的基本功能
  • 解释 Vue 3 中的 Composition API
  • css中字体的加载,仅在使用的时候加载,会阻塞,用font-display:swap
  • uni-app vue3 使用笔记
  • [手机Linux] onepluse6T 系统重新分区
  • MySQL数据库(七)SQL 优化
  • 扩展知识--缓存和分时复用cpu
  • TensorFlow域对抗训练DANN神经网络分析MNIST与Blobs数据集梯度反转层提升目标域适应能力可视化...
  • 除了wps还有什么表格软件可以在上面切换不用单独启动窗口
  • Python截图轻量化工具
  • MySQL部署基于二进制日志文件位置的主从复制集群
  • 使用Jenkins、K8S、Docker一键部署SpringCloud微服务
  • 【AI智能时代】QA素质模型和知识等级分类
  • LLM:DeepSeek 系列(二)
  • BFS算法篇——广度优先搜索,探索未知的旅程(上)
  • t113-qt
  • TypeScript 中的联合类型:灵活的类型系统
  • 《机器学习数学基础》补充资料:矩阵基本子空间
  • ubuntu服务器部署mediacms之后,忘记密码的解决办法