Unity读取并解析Shapefile地图文件

本文介绍了Unity中如何读取和解析ESRI Shapefile,包括文件组成、.shp、.shx和.dbf文件结构的详细讲解,以及Shapefile的数值类型和字节序。同时提到了一个参考的Github库ShpLoader,用于帮助理解Shapefile的读取过程。
摘要由CSDN通过智能技术生成

参考

Github库:ShpLoader

有需要的同学请移步上面这位大佬的github库。我只是对内容做一个小小的总结。

一、文件介绍

1.shapefile组成

ESRI shapefile由一个主文件,一个索引文件组成。和一个dBASE表。主文件是一个直接访问、可变记录长度的文件,其中每条记录都用它的顶点列表来描述一个形状。在索引文件中。每条记录包含对应的主文件记录从主文件开始的偏移量。dBASE表包含每个特性一条记录的特性属性。几何图形和属性之间的一对一关系是基于记录号的。dBASE文件中的属性记录必须与主文件中的记录的顺序相同。

命名规范
所有的文件名都遵循8.3命名约定。的主要文件。索引文件。和dBASE文件具有相同的前缀。前缀必须以字母数字字符(a-Z)开头。0 - 9)。后跟0个或最多7个字符(a-Z)。0 - 9)。主文件的后缀是.shp。索引文件的后缀是.shx。dBASE表的后缀是.dbf。在具有区分大小写的文件名的操作系统上,文件名中的所有字母都是小写的。
在这里插入图片描述
数值类型
shapefile存储整数和双精度数。本文件的其余部分将引用以下类型:整数:带符号的32位整数(4字节)双:带符号的64位IEEE双精度浮点数(8字节)浮点数必须是数值。正无穷。在shapefile中不允许出现负无穷和非数字(NaN)值。然而,shapefiles支持“无数据”值的概念。但它们目前仅用于测量。shapefile读取器认为任何小于10的浮点数表示“无数据”值。

2.Main File(.shx)的文件结构

主文件(.shp)包含一个固定长度的文件头,后面跟着可变长度的记录。每个可变长度的记录由固定长度的记录头和可变长度的记录内容组成。图1说明了主文件的组织。
在这里插入图片描述
字节序
shapefile中的所有内容可以分为两类:

  • 相关的数据
    • 主文件的记录内容
    • 主文件头的数据描述字段(Shape Type)。Bounding Box等)
  • 相关文件管理
    • 文件和记录长度
    • 记录偏移量。等等

组成文件头(下面标识)中的数据描述字段和主文件中的记录内容的整数和双精度整数采用小端字节顺序(PC或Intel)。构成文件和文件管理的其余部分的整数和双精度浮点数采用大端字节顺序(Sun或Motorola)。相关参考浅谈字节序(Byte Order)及其相关操作

主文件的Header
主文件头的长度为100字节。表1显示了文件头中的字段及其字节位置、值、类型和字节顺序。在表中,位置与文件的开始有关。
在这里插入图片描述
文件长度的值是以16位字表示的文件总长度(包括组成头的50个16位字)。shapefile中的所有非空形状都需要具有相同的形状类型。形状类型的值如下:
在这里插入图片描述
目前,shapefile被限制为包含与上面指定的形状相同类型的形状。在未来。shapefiles可以允许包含一种以上的形状类型。如果实现了混合形状类型,头中的形状类型字段将标志该文件主文件头中的Bounding Box文件中形状的实际范围:与包含所有形状的X和Y轴(可能还有M和Z轴)正交的最小边框。如果shapefile是空的(即没有record)。Xmin,Ymin,Xmax,Ymax是未指定的。Mmin和Mmax可以包含“no data”值,用于测量形状类型的shapefile,这些形状文件不包含度量值。

Record Headers
每个记录的头存储记录编号和记录的内容长度。记录头的长度为8字节。表2显示了文件头中的字段及其字节位置、值、类型和字节序。在表中,position和record的start有关。
在这里插入图片描述
记录数字从1开始。记录的内容长度是记录内容部分的长度,用16位的字来度量。每条记录,因此。将(4 +内容长度)16位的字作为文件的总长度&

要在Unity读取Android设备的根目录文件,需要使用Android的Java层代码和Unity的C#层代码进行交互。具体步骤如下: 1. 在Unity中创建一个C#脚本,用于调用Android的Java层代码。 2. 在该脚本中定义一个函数,用于调用Android的Java层代码读取文件,并返回文件内容。 3. 在Java层代码中,通过Android API获取根目录路径,并读取文件内容。 4. 将文件内容返回给Unity的C#层代码。 以下是一个示例代码,演示了如何在Unity读取Android设备根目录下的文件: 在C#层代码中: ``` using UnityEngine; using System.Collections; using System; public class AndroidFileReader : MonoBehaviour { private AndroidJavaObject androidFileReader; void Start() { androidFileReader = new AndroidJavaObject("com.example.AndroidFileReader"); } public string ReadFile(string filePath) { return androidFileReader.Call<string>("readFile", filePath); } } ``` 在Java层代码中: ``` package com.example; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import android.os.Environment; public class AndroidFileReader { public String readFile(String filePath) { File file = new File(Environment.getExternalStorageDirectory() + "/" + filePath); StringBuilder stringBuilder = new StringBuilder(); try { FileInputStream inputStream = new FileInputStream(file); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = null; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } bufferedReader.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } } ``` 在上面的示例代码中,我们创建了一个名为 AndroidFileReader 的 Java 类,该类包含一个名为 readFile 的函数,用于读取指定路径下的文件。在 C# 层代码中,我们使用 Unity 提供的 AndroidJavaObject 类,来实例化该 Java 类,并调用其 readFile 函数读取文件。需要注意的是,为了能够读取 Android 设备的根目录文件,我们需要在 AndroidManifest.xml 文件中添加如下权限: ``` <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值