JAVA以SHP文件,切割一个数据集中边界内的范围或数据
什么是SHP文件
*.shp(Shapefile)是地理信息系统(GIS)中最常用的矢量数据格式之一,用于存储地理空间数据(如点、线、面等)。
一个完整的Shapefile通常由多个文件组成shp主文件、shx索引文件、dbf属性表等。
它几乎兼容所有GIS软件与多种语言(JAVA、PAYTHON等),相比GeoJSON、KML等格式,文件体积更小。
注:由于本次代码以grb2文件举例,若是需要了解nc文件,请看上次的文章《JAVA解析气象文件(GRIB、NC)并以JSON格式输出》链接: link
代码逻辑
本次代码是使用shp文件中的坐标边界闭环,查询在一个大数据集(如全亚洲的数据)中shp(如中国的SHP文件)边界内的数据。
分为以下几步:
1.根据shp文件读取对应的边界数据,由于边界数据多以不规则多边形为主(如行政区划、湖泊、地形等),用Polygon对象存储边界数据并转化为Geometry对象
2.解析nc或grb2(大数据集)的所有数据,分析数据内容与格式,并对数据进行逻辑处理
3.从数据集中筛选出边界内的数据
部分内容解释
首先了解以下几个比较重要的对象,帮助我们理解代码
Polygon对象
Polygon(多边形)是GIS和计算机图形学中的核心几何对象,用于表示闭合的二维区域,如行政区划、湖泊、建筑轮廓等。
它的实际存储结构如下所示:
基础结构:
POLYGON ((109.0000000001 26.0000000001, 109.xxxxxxxxxx 26.xxxxxxxxxxxxxxx, 109.xxxxxxxxxxxxxxx 26.xxxxxxxxxxxxxxx 。。。109.0000000001 26.0000000001))
当它所描述的区域是一片闭环的区域中内部存在另一个不属于它的闭环区域,也就是常说的区域带孔洞,可以存在多个:
POLYGON ((109.0000000001 26.0000000001, 109.xxxxxxxxxx 26.xxxxxxxxxxxxxxx, 109.xxxxxxxxxxxxxxx 26.xxxxxxxxxxxxxxx 。。。109.0000000001 26.0000000001)(120.0000000001 55.0000000001, 120.xxxxxxxxxx 55.xxxxxxxxxxxxxxx, 120.xxxxxxxxxxxxxxx 55.xxxxxxxxxxxxxxx 。。。120.0000000001 55.0000000001)(。。。))
还有一种情况,是当所有描述区域是分开的两个闭环区域时,也就是常说的飞地,以代码进行解释:
// 1. 获取数据存储
File file = new File("D:\\xxxxxxxxx.shp");
try {
// 2. 获取数据存储
FileDataStore store = FileDataStoreFinder.getDataStore(file);
// 3. 获取特征源
SimpleFeatureSource featureSource = store.getFeatureSource();
// 4. 获取特征类型
SimpleFeatureType schema = featureSource.getSchema();
System.out.println("Schema: " + schema);
int i = 0;
// 5. 遍历特征
try (FeatureIterator<SimpleFeature> features = featureSource.getFeatures().features()) {
while (features.hasNext()) {
SimpleFeature feature = features.next();
String iId = String.valueOf(feature.getAttribute(5));
System.out.println("--------------"&