windows和docker环境下springboot整合gdal3.x
链接: gdal官网地址
gdal
gdal的一个用c++语言编写的库,用于处理地理信息相关的数据包括转换,识别数据,格式化数据以及解析
同时提供第三方语言的SDK包括python,java上述需要编译后使用 java是需要使用jni接口调用实现方法在window平台是DLL文件,在linux平台是so文件,最后需要使用和初始化服务。
windows环境
链接: gdal Download

(1)第一种简单粗暴的方式就是把gdal包bin目录下所有的dll文件和bin\gdal\java下的dll文件丢到你的JDK的bin目录下,对应的jar包也许在\bin\gdal\java目录下。
链接: windows Springboot 集成GDAL开发环境配置
1.将解压后的GDAL压缩包bin文件夹下的所有dll文件拷贝到自己电脑的jdk安装目录下的bin文件夹中(我的电脑是C:\jdk\bin),如果有冲突文件可以跳过。 注意是jdk下bin文件夹,不是jre下的bin。

2.将压缩包解压后的bin\gdal\java\gdalalljni.dll文件同样到jdk下的bin文件夹中

(2)第二种是自己新建一个文件夹把需要的dll文件全放在一起,然后自己配环境变量(总之让系统能找到你的库就行了)。



Path 添加

Linux和docker环境
链接: OSGeo/gdal github地址
在Linux上,gdal官网上没有编译好的包,要自己去下gdal的源码包,然后自己编译,后面会生成.so文件和jar包,和windows一样可以配置环境变量或者把so文件丢到jdk的bin目录下。
-- 拉取镜像
docker pull osgeo/gdal:latest-- 以本机的网络模式运行 内部的端口则可以直接访问了
docker run -it --rm -v /home/gadl/tmp/sll:/tmp/sll -d --network=host osgeo/gdal:latest-- 查看GDAL库的版本。
gdalinfo --version-- 查看java的版本。
java -version-- 进入目录
docker exec -it 容器id /bin/bashcd /tmp/sll/-- 把jar复制进来
java -jar 启动 jar包

docker-compose启动
gdalservice:image: "osgeo/gdal:latest"container_name: gdalservicevolumes:- ./gdalservice/data:/data- /opt/docker-project/gdalservice/data/geo-api-0.0.1-SNAPSHOT.jar:/app/geo-api-0.0.1-SNAPSHOT.jarenvironment:- SOME_ENV_VAR=valuecommand: /bin/sh -c "java -jar /app/geo-api-0.0.1-SNAPSHOT.jar"ports:- "9003:9003"
测试代码
链接: 官方gdal的java调用API
写个springboot项目接口 打包上去测试即可
引入依赖
<!-- https://mvnrepository.com/artifact/org.gdal/gdal --><dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>3.7.0</version></dependency>
public static void main(String[] args) {// 指定文件的名字和路径String gdbFile = "D:\\test\\MyProject12.gdb";// 注册所有的驱动ogr.RegisterAll();// 为了支持中文路径,请添加下面这句代码gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");// 为了使属性表字段支持中文,请添加下面这句gdal.SetConfigOption("SHAPE_ENCODING", "CP936");//打开文件获取数据集Dataset dataset = gdal.OpenEx(gdbFile);if (dataset == null) {System.out.println("打开"+gdbFile+"失败"+gdal.GetLastErrorMsg());System.exit(1);}Group group = dataset.GetRootGroup();Vector<String> vector1 = group.GetGroupNames();System.out.println(vector1);for (String name : vector1) {Group group1 = group.OpenGroup(name);Vector<String> vector = group1.GetVectorLayerNames();for (String o : vector) {Layer layer = group1.OpenVectorLayer(o);System.out.println(layer.GetName());}}Vector vector2 = group.GetVectorLayerNames(vector1);System.out.println(vector2);// 读取数据,这里以gdb文件为例// 程序提供对ArcGIS 9及以上版本创建的文件geodatabase.gdb目录的矢量层的读取访问。数据集名称必须是目录/文件夹名称并且必须以.gdb扩展名结尾。它还可以直接读取zipped.gdb目录扩展名为.gdb.zip前提是它们在第一级包含一个.gdb目录。也可以直接打开特定的.gdbtable文件包括“system”表。几何图形中的曲线由GDAL>=2.2支持。String strDriverName = "OpenFileGDB";// 创建一个文件,根据strDriverName扩展名自动判断驱动类型org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);if (oDriver == null) {System.out.println(strDriverName + " 驱动不可用!\n");return;}DataSource dataSource = oDriver.Open(gdbFile, 0);for (int i = 0; i < dataSource.GetLayerCount(); i++) {Layer layerIdx = dataSource.GetLayer(i);System.out.println("图层名称 要素类:<==>" + layerIdx.GetName());}Layer layer = dataSource.GetLayer("test");SpatialReference spatialReference = layer.GetSpatialRef();System.out.println("空间参考坐标系:" + spatialReference.GetAttrValue("AUTHORITY", 0)+ spatialReference.GetAttrValue("AUTHORITY", 1));double[] layerExtent = layer.GetExtent();System.out.println("图层范围:minx:" + layerExtent[0] + ",maxx:" + layerExtent[1] + ",miny:" + layerExtent[2]+ ",maxy:" + layerExtent[3]);FeatureDefn featureDefn = layer.GetLayerDefn();int fieldCount = featureDefn.GetFieldCount();Map<String, String> fieldMap = new HashMap<String, String>();for (int i = 0; i < fieldCount; i++) {FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);// 得到属性字段类型int fieldType = fieldDefn.GetFieldType();String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);// 得到属性字段名称String fieldName = fieldDefn.GetName();fieldMap.put(fieldTypeName, fieldName);}//System.out.println(fieldMap);long featureCount = layer.GetFeatureCount();System.out.println("图层要素个数:" + featureCount);Feature feature2 = null;while ((feature2 = layer.GetNextFeature()) != null) {// System.out.println(feature2.GetGeometryRef().ExportToJson());//System.out.println(feature2.GetFieldAsString("Shape_Area") + "\t" + feature2.GetFieldAsString("省区"));}oDriver.delete();gdal.GDALDestroyDriverManager();}
参考链接
链接: Linux下安装GDAL(含docker部分)
链接: Java调用开源GDAL解析dxf成shp,再调用开源GeoTools解析shp文件
链接: Ubuntu基于Docker快速配置GDAL的Python、C++环境)
链接: docker pull osgeo/gdal:latest
链接: linux机器搭建java版gdal环境
链接: gdal容器化记录
链接: 【Linux】CentOS制作Java+GDAL环境镜像并部署运行SpringBoot项目
相关文章:
windows和docker环境下springboot整合gdal3.x
链接: gdal官网地址 gdal gdal的一个用c语言编写的库,用于处理地理信息相关的数据包括转换,识别数据,格式化数据以及解析 同时提供第三方语言的SDK包括python,java上述需要编译后使用 java是需要使用jni接口调用实现方法在wind…...
大数据与健康:技术助力医疗卫生事业腾飞
大数据与健康:技术助力医疗卫生事业腾飞 随着科技的飞速发展,大数据技术已经渗透到我们生活的方方面面,包括医疗卫生领域。本文将对大数据在健康医疗领域的应用进行分析,并通过数据图表展示其发展趋势和前景。 一、背景介绍 近…...
《巴渝小将》少儿电视综艺走进江小白金色黄庄拍摄圆满成功!
巴渝小将,乘风破浪! 张扬巴渝魅力,展示少年风采,本期拍摄我们来到了位于江津的江小白金色黄庄。 江小白金色黄庄位于永兴镇黄庄村,是一座充满诗意又不乏童趣的农文旅综合体,基于当地良好的酿酒高粱产业基础…...
【uniapp】顶部和底部导航栏无法正常显示
关于顶部导航栏不显示的问题: 顶部导航栏在配置了 navigationBarTitleText 还是无法显示,如果是使用他人的项目结构,需要检查是否已经被配置了自定义导航栏: "navigationStyle": "custom" "globalStyle&…...
【ArcGIS模型构建器】06:ArcGIS中DOM批量分幅教程
ArcGIS中利用模型构建器实现DOM批量分幅裁剪。 文章目录 1. 加载数据2. 批量分幅1. 加载数据 批量分幅通常是基于数字正射影像来实现。 数字正射影像(DOM.tif)CASS标准图幅(shp) 2. 批量分幅 单个图幅可以通过裁剪或者按掩膜提取工具来进行,批量分幅采用模型构建器进行。…...
uniapp 设置 editor 默认值
dom 元素长这样 <editor id"editor" value12323 class"ql-container container" placeholder"开始输入..." ready"onEditorReady" blur"submit"></editor> 注意赋值必须要用 data 里面变量数据 不要let 定义…...
动态规划:计数类DP
整数划分: 二维做法: #include <iostream>using namespace std;const int N 1e3 7, mod 1e9 7;int f[N][N];int main() {int n;scanf("%d",&n);//总数为0时,前i个数字全不选也是一种方案,但某个数字不…...
Arcmap制图绘制显著性区域
类似于下图这种,为分析结果添加显著性区域,该如何实现呢? 实现方式多种多样,比如: 1、代码。Python、R、Matlab都有实现方式,但是绘制一幅优美的地图,用代码绘制,需要添加很多控制语…...
你一般会什么时候使用CHATGPT?
在当今数字时代,人们对于人工智能(AI)的依赖程度日益增加,而ChatGPT作为一种强大的自然语言处理工具,吸引了人们的广泛关注和应用。那么,人一般在什么时候会想要使用ChatGPT呢?这个问题涵盖了多…...
单例模式下双重校验锁 DCL 的灵魂三问
文章目录 前言如何实现一个双重校验锁 DCL定义一个单例变量定义一个获取单例的方法性能优化性能优化带来的一点点问题什么是指令重排? 总结如何理解文章开篇理解的三个问题1、为什么需要使用两个 if 语句?2、为什么使用了 synchronized 关键字还需要使用…...
oracle中关于connect by的语法及实现(前序遍历树)
语法 connect by是是结构化查询中用到的,其基本语法是: 1 select … from tablename 2 start with 条件1 3 connect by 条件2 4 where 条件3; 使用示例 例: create table tree(id int,parentid int); insert into tree values(120,184); …...
学习笔记二十七:K8S控制器Statefulset入门到企业实战应用
这里写目录标题 Statefulset控制器:概念、原理解读Statefulset资源清单文件编写技巧查看定义Statefulset资源需要的字段查看statefulset.spec字段如何定义?查看statefulset的spec.template字段如何定义 Statefulset使用案例:部署web站点State…...
JavaScript 的 闭包
在 JavaScript 中,闭包是一种强大的特性,它允许函数在结束执行后,仍能访问并控制其外部的局部变量。这种特性在许多高级 JavaScript 编程场景中都发挥着关键作用,如创建函数工厂、实现数据隐藏和封装等。 1、闭包的原理 JavaScri…...
二蛋赠书六期:《Linux管理入门经典(第8版)》
前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…...
19.10 Boost Asio 同步文件传输
在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这…...
微信小程序:两层循环的练习,两层循环显示循环图片大图(大图显示、多层循环)
效果 代码分析 外层循环 外层循环的框架 <view wx:for"{{info}}" wx:key"index"></view> wx:for"{{info}}":这里wx:for指令用于指定要遍历的数据源,即info数组。当遍历开始时,会依次将数组中的每…...
输入几个数,分别输出其中的奇数和偶数
这个问题我们只需要设计几个循环嵌套在一起就可以解决,话不多说,我们直接上代码 目录 1.运行代码 2.运行结果 1.运行代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h>int main() {int arr[10] {1,2,3,4,5,6,…...
香港Web3.0:从政策到实践,探索未来发展路径
随着互联网技术的快速发展,互联网正在经历从Web1.0到Web3.0的重大升级。在这场互联网新技术革命的浪潮中,谁能抓住机遇,谁就能成为未来的引领者。 2022年11月,香港政府发布了《有关香港虚拟资产发展的政策宣言》,彰显…...
Java程序员面试核心知识--Java基础知识(一)
目录 一、Java程序初始化顺序 二、Java的Clone方法作用 三、 OverLoad(重载)与Override(重写)区别 四、abstract class(抽象类)与interface(接口)的异同 五、String、StringBuf…...
Linux的test测试功能
测试文件名的类型,文件是否存在, 文件的权限检测 文件之间的比较 两个整数之间的比较 判断字符串数据 多重条件判定 一个一个来,这个有点多,不过比较有意思,来代码 案例1,判断文件是否存在ÿ…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
