Java开发环境中,使用GDAL进行矢量叠加,并计算面积
GDAL与Springboot的集成可参考Springboot 集成GDAL开发环境配置
Java开发环境下,GDAL的相关学习和使用的案例还是非常少的,并且部分函数的使用方式和Python、C环境下有很大的区别。已最近做的一个功能为案例,给大家分享一下Java环境下GDAL的用法。
具体流程
有一个已经做好的某种作物的种植情况遥感解译栅格影像(单波段),需要提供一个接口,入参为目标区域面的空间坐标,最后返回结果为目标区域内属于该作物的种植面积。实现流程如下:
注意点
1.矢栅叠加
矢栅叠加的结果最好设置为EPSG:3857坐标系,它是以米为单位的坐标系,计算面积准确。
2.面积计算
面积计算有两种方式:
- 计算有效像元数量,乘以像元面积。像元面积为分辨率的平方。
- 叠加后的栅格转矢量,计算矢量面积。(只适合单波段)。
前面的方法相对简单,我这里采用的是第一种方法。
3.GeoJson转Shp文件
GeoJson转Shp文件时一定要设置坐标系。不然后面的叠加可能出不来结果。
全部代码
package com.example.gdal.controller;import org.gdal.gdal.*;
import org.gdal.gdalconst.gdalconstConstants;
import org.gdal.ogr.*;
import org.gdal.ogr.Driver;
import org.gdal.osr.SpatialReference;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.File;
import java.util.Arrays;
import java.util.Vector;/*** 调整区划代码*/
@RequestMapping("/")
@RestController
public class TestController {@PostMapping("/test")String addInsureTask(@RequestBody String geoJson) {ogr.RegisterAll();Dataset raster = gdal.Open("E:\\测试数据\\zzjg_41_16_2022_20220812\\栅格\\zzjg_41_16_2022_20220812.tif", gdalconstConstants.GA_ReadOnly);
// //获取到六参数数组
// double[] ori_transform = raster.GetGeoTransform();
// //最小x
// double minX = ori_transform[0];
// //x方向分辨率
// double resoutionX = ori_transform[1];
// //x方向旋转角度
// double angleX = ori_transform[2];
// //最大y
// double maxY = ori_transform[3];
// //Y方向旋转角度
// double angleY = ori_transform[4];
// //y方向分辨率
// double resoutionY = ori_transform[5];
// //x方向的像素数
// int pixelX = raster.getRasterXSize();
// //y方向像素
// int pixelY = raster.getRasterYSize();String tempShpPath="E:\\测试数据\\zzjg_41_16_2022_20220812\\栅格\\mask.shp";jsonToShp(geoJson,tempShpPath,raster.GetProjection());String resultPath="E:\\测试数据\\zzjg_41_16_2022_20220812\\栅格\\111.tiff";warp(resultPath,raster,tempShpPath);double area=getArea(resultPath);gdal.GDALDestroyDriverManager();return area+"平方米";}/*** 矢量裁剪栅格* @param targetPath* @param raster* @param shpPath*/public void warp(String targetPath,Dataset raster,String shpPath){// SpatialReference oSRS = new SpatialReference();
// oSRS.ImportFromEPSGA(3857);
// System.out.println(oSRS.toString());
// oSRS.SetWellKnownGeogCS("EPSG:3857");Vector<String> vector=new Vector<>();vector.addElement("-t_srs");vector.addElement("EPSG:3857");//结果转到3857坐标系,便于计算面积vector.addElement("-cutline");vector.addElement(shpPath);vector.addElement("-crop_to_cutline");vector.addElement("true");WarpOptions warpOptions=new WarpOptions(vector);Dataset[] sources=new Dataset[]{raster};//矢栅叠加gdal.Warp(targetPath,sources,warpOptions);}/*** geoJson转shp文件* @param geoJson* @param tempShpPath* @param srs*/public void jsonToShp(String geoJson, String tempShpPath, String srs){//从geoJson构建字符串,构建GeometryGeometry geometry=ogr.CreateGeometryFromJson(geoJson);Driver shpDriver=ogr.GetDriverByName("ESRI Shapefile");if(new File(tempShpPath).exists()){//文件存在,提前删除shpDriver.DeleteDataSource(tempShpPath);}System.out.println(srs.toString());//创建shp文件DataSource tempShp =shpDriver.CreateDataSource(tempShpPath);SpatialReference spatialReference=new SpatialReference(srs);//复制坐标系Layer layer=tempShp.CreateLayer("polygon",spatialReference);Feature feature = new Feature(layer.GetLayerDefn());feature.SetGeometry(geometry);layer.CreateFeature(feature);layer.SyncToDisk();tempShp.FlushCache();}public double getArea(String rasterPath){Dataset raster = gdal.Open(rasterPath, gdalconstConstants.GA_ReadOnly);int xSize=raster.getRasterXSize();int ySize=raster.getRasterYSize();Band band=raster.GetRasterBand(1);//读取noData值Double[] noData=new Double[1];band.GetNoDataValue(noData);double[] pixValue = new double[xSize * ySize];band.ReadRaster(0,0,xSize,ySize,pixValue);long count=0;for (int i = 0; i < pixValue.length; i++) {if(pixValue[i]!=noData[0]){count++;}}double pixel = raster.GetGeoTransform()[1];double area=pixel*pixel*count;return area;}}
参数示例
{"type": "Polygon","coordinates": [[[114.36676024162932,33.562408688929679],[114.36640332247839,33.556757469040804],[114.37135102442949,33.556444982601761],[114.37170794358042,33.562096202490636],[114.36676024162932,33.562408688929679]]]
}
影像文件示例
Java开发环境中,使用GDAL进行矢量叠加,并计算面积相关推荐
- macOS下GDAL Java开发环境搭建
文章目录 macOS下GDAL Java开发环境搭建 GDAL源码编译安装 Maven安装本地JAR 使用Java版GDAL示例 版权声明:本文为博主原创文章,转载请注明原文出处! 写作时间:2020 ...
- 开发环境中实现Lombok消除Java冗余
Lombok是一种JavaArchive(JAR)文件,可用来消除Java代码的冗长.通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往 ...
- java opencv 开发环境_在IntelliJ IDEA 13中配置OpenCV的Java开发环境
准备工作: 下载IDEA 13(这里以版本13为例,后面简称IDEA): 下载Java JDK(用于配置基本的Java开发环境): 下载OpenCV 2.4.9(这里以版本2.4.9为例,据这篇文章说 ...
- 在10分钟内在新Mac中设置Java开发环境(更新)
这只是一个小的更新文章,它引用了2个较旧的条目( a , b ),我将它们合并为一个步骤,就像一步操作,并确保所有功能都在最新的MacOSX 10.9 Mavericks下工作 . 我主要针对的是初次 ...
- 在Windows 7中设置Java开发环境
一段时间以来,我收到了很多愿意尝试Java语言的学生和人们的要求,它们提供了关于如何设置Java开发环境的简单指南,类似于我一年前写的那样. Mac用户. 看到这里和这里 . 因此,本文主要针对Jav ...
- linux搭建java开发环境_linux中搭建java开发环境
今天试着在Linux下面搭建java开发环境,现总结一下具体步骤. 1.JDK的安装1.6 版本 cd /opt mkdir java 执行下面命令安装JDK(首先创建/opt/java目录) tar ...
- 上课偷懒全靠它,VS code中搭建Java开发环境+小霸王游戏环境—颤抖吧,德玛西亚!!
上课偷懒全靠它,VS code中搭建Java开发环境+小霸王游戏环境-颤抖吧,德玛西亚!!! Visual Studio Code 下载安装 搭建小霸王游戏环境 VS code 中搭建 JAVA 开发 ...
- 平板中下载aidlux,配置java开发环境
平板配置java开发环境详细过程 安装jdk 在vscode中下载Extension Pack For Java插件 在vscode中进行测试 安装jdk jdk下载地址,选择ARM64的jdk 将下 ...
- vscode java环境_VSCode中Java开发环境的配置方法
vscode中怎么搭建Java开发环境?下面本篇文章给大家介绍一下VSCode配置Java开发环境的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 配置Java开发环境 主要参 ...
最新文章
- python 获取网络图片的大小
- rest-framework:权限组件
- Go——Artifactory的AQL查询以及json解析解决方案
- 年薪 50w 难吗?分享我的 2 个捷径
- HID接口设备-固件要求
- C语言逗号运算符和逗号表达式基础总结
- 快要“成精”的波士顿机械狗,开始卖了,价格不贵准备搞一只
- java分页中显示更多_早期更多失败– Java 8
- php mysqliquery 返回值,PHP mysqli_multi_query() 函数_程序员人生
- 商城左侧菜单栏网页模板
- 雷林鹏分享:C# 事件(Event)
- Jquery的普通事件和on的委托事件
- Android系统源码编译
- magisk卸载内置软件_安卓刷XP框架 手机通用通用(Magisk+Riru+EdXposed)
- HiveSQL percentile和percentile_approx 函数计算千分数
- 因为Windows防火墙服务未运行,不能正常使用
- 清华大学课题组联合美团研发无人机声波定位技术获ACM SenSys顶会大奖
- 手机验证码接收注册新账户
- Unity VR(PicoVR)
- 51单片机入门之四:静态数码管,单片机如何驱动数码管
热门文章
- mina学习笔记七:串口编程
- VMware虚拟机与主机之间文件共享配置
- [转][留着备用]如何彻底卸载删除pptv(pplive)
- 手把手|100行Python代码自动抢火车票!(包教包会)
- 面具busybox模块_使用 linux kernel +busybox 定制linux系统
- HBuilderX自定义编辑器代码颜色
- 【每日一问】什么是API?
- 也谈今日IBM(IBM china/IGSC/ISSC/ETC)
- 使用nginx搭建HTTP FLV流媒体服务器
- 阿里人工智能云养猪重新定义什么是好猪