技术研究之正射影像
1.前言
在做庚保项目的时候,会涉及到无人机正射影像的问题。
- 1.OpenDroneMap
- 2.PhotoScan
- 3.Pix4dmapper
- 4.ENVI OneButton
2.无人机
可以通过无人机手柄设置 正射影像数据范围,然后进行正射影像的生成。
【1】.用大疆无人机获取目标范围正射影像 设置测区范围,生成航线。
2.OpenDroneMap
OpenDroneMap™ 这个是一个开源的项目,提供了很多的途径使用,包括:WebODM、NodeODM、CloudODM、PyODM、ClusterODM、NodeMICMAC、FIELDimageR、Find-GCP,操作方法。
【1】.如何使用OpenDroneMap对航拍图像快速建模 Docker 的运行指令。-it 指让 Docker 分配一个伪输入终端并以交互模式运行容器;–rm 是指在容器运行完之后自动清除以节省电脑存储空间。
【2】.基于ODM和Cesium的无人机倾斜摄影建模及可视化 这是一篇论文,通过docker-java启动了opendronemap,进行了图像拼接。本文通过研究Web应用系统和三维GIS技术,结合三维GIS集成无人机数据处理的需求,对无人机数据处理和可视化系统进行研究与设计。本文提出的系统方案釆用当前前沿的三维WebGIS技术,该结构各部分组件之间配合良好,功能强大,主要数据处理部分ODM通过docker-java封装,单独与Java Spring框架结合划分微服务,方便开发调用和扩展。基于Java Spring框架与开源WebGIS技术结合起来,在 Web应用系统通用功能方面釆用 Springboot+Mybatis+Vuejs的架构确保了平台的安全性,完整性、可移植性和可扩展性。在GIS特有功能实现上采用PostGIS作为空间数据库,GeoServer作为地图应用服务器,采用 GeoWebCache为地图缓存[5],以Cesium为客户端。以Tomcat为Web服务器搭建完成了无人机数据处理系统。
2.1.安装
这里我使用了 docker 安装了 odm ,至于这个网络问题,我真是费了好大的劲,就是无法下载这个镜像,最后只能挂代理的方式把这个镜像下载下来。
1 | docker pull opendronemap/odm |
【1】.Opendronemap的docker使用
【2】.桌面版docker设置代理 这里设置了代理。
【3】.国内无法拉取Docker镜像了?这些方法拯救你的Docker 1.某些云镜像加速。2.使用Docker Hub并将镜像推送到阿里云自有仓库。3.使用Github Action 构建docker镜像。4.部署DockerHub的代理。5.镜像仓库前缀替换。
2.2.使用
使用docker命令就可以直接获取相关的内容:
- odm_meshing # 3D 网面建模
- odm_texturing # 纹理网面建模
- odm_georeferencing # 地理配准后的点云图
- odm_orthophoto # 正射影像图
- odm_report # 程序运行报告
1 | # linux 使用 |
2.4.docker-java
使用 java 操作 docker,这种方式有些麻烦,需要先把 docker http 的接口打开,打开之后就可以通过 API 进行调用了。这种方式其实也挺麻烦的,还需要处理权限校验的问题。
(1) 添加依赖
1 | <dependency> |
(2) 创建容器
通过代码创建一个 Docker
【1】.Java API 操作Docker浅谈 1.创建Docker客户端。2.创建镜像。3.创建容器。4.启动容器。5.停止和删除容器。
【2】.在Java中执行docker命令 在Java中执行docker命令可以使用Java的Runtime类或ProcessBuilder类。
【3】.java代码执行docker命令 这里使用了 docker-java 依赖,然后有一个 withCmd 参数。1.引入 Docker 的 Java API 包。2.创建 Docker 客户端连接。3.创建 Docker 容器。4.启动 Docker 容器。5. 执行 Docker 命令。6.停止 Docker 容器。7.删除 Docker 容器。8.关闭 Docker 客户端连接。
【4】.使用Java Client API安全地远程调用Docker API 默认 docker 只允许本机使用docker命令进行操作,我们现在来开启 http api 调用,使得其他机器可以通过 http 请求来操作 docker。
2.5.java命令行
使用命令行的方式,其实更加的简单,直接通过 Runtime.getRuntime() 命令执行就可以了,假定已经 通过 docker pull 拉取了 opendronemap/odm 的镜像。
1 | String photoPath = resource + "/orthophoto/"+uuid; |
【1】.Java 执行cmd程序,并获取命令行内容 java中的RunTime类,每个java程序都有一个RunTme的运行实例,能够使运行程序与其运行的环境相连接。Process 类能够创建本地进程,也可以通过RunTime的实例exec()方法创建。Process 的 getInputStream() 会获取窗体命令执行的结果,可以把它转化成字符串进行输出。
【2】.Java Process执行cmd命令是异步的吗
【3】.java多线程run方法传参
【4】.java调用命令行工具 1.ProcessBuilder方式。2.Runtime#exec执行。
【5】.Java中Process和Runtime()使用,以及调用cmd命令阻塞解决 java调用cmd执行bat文件有时会出现卡死的现象,当时感觉很迷惑,后来查资料,本来一般都是这样来调用程序并获取进程的输出流的,但是我在windows上执行这样的调用的时候却总是在while那里被堵塞了,结果造成ffmpeg程序在执行了一会后不再执行,这里从官方的参考文档中我们可以看到这是由于缓冲区的问题,由于java进程没有清空ffmpeg程序写到缓冲区的内容,结果导致ffmpeg程序一直在等待。
【6】.Java程序调用Docker命令并获取输出 开发一个可以在服务器调用Docker命令的Java程序,然后build成jar包,直接丢到服务器跑
【7】.关于JAVA Project.waitfor()返回值是1
2.6.python命令行
除了可以使用 java 执行命令行,还可以使用 python 执行命令行。
1 | """ |
【1】.Python3 subprocess 这里将错误输出和正确输出都放到一个管道里面了
【2】.Python_多进程_subprocess(含标准输入、输出、错误输出)
【3】.python:输出subprocess中子进程的运行信息
【4】.Python 执行cmd命令的3种方法简单示例,并获取返回信息、执行命令结果(成功 or 失败) 这里有错误码相关的说明。
【5】.Python使用subprocess模块时隐藏输出与显示错误的参数设置方法
【6】.Python获取控制台输出点方法 1.非实时输出:subprocess.run。2.实时输出 subprocess.Popen。
【7】.记录Python 调用 subprocess.Popen 卡死解决办法 这里用了 run 方法替代了 Popen 方法。stderr=subprocess.STDOUT:将子进程的标准错误输出合并到标准输出中。shell=True:表示通过系统的 shell 来执行命令,可以使用命令的通配符、管道等功能。
【8】.Python调用subprocess.Popen卡死的解决方案 这里定义了一个 tempfile.SpooledTemporaryFile(bufsize=10*1000),自定义输出内容大小
【9】.python Popen卡死问题 原因是使用Popen.wait()后直接读PIPE.stdout.read()之前,可能缓存已经满了,此时导致了卡死。解决办法:使用communicate(),最后在调用Popen的时候加上参数close_fds=True。
【10】.解决Popen运行程序buff存满、通道阻塞导致进程卡死问题 创建一个临时文件,把输出结果存到临时文件中,从临时文件中读取结果
【11】.使用subprocess模块调用子进程并获取输出
【12】.python3 subprocess.Popen监控控制台输出 如下所示为本例参考代码。使用 Python3 内置模块 subprocess.Popen 建立channel 。设定参数encoding=’utf8’,转码简体中文。设定universal_newlines=True以及bufsize=1建立缓冲区,以便捕获频繁刷新的进度条等特征信息。
2.7.GPU
最近几次我尝试生成正射影像,我发现cpu总是跑满的,i9-12900k 也不行。
1 | docker run -ti --rm -v c:/Users/youruser/datasets:/datasets --gpus all opendronemap/odm:gpu --project-path /datasets project |
【1】.GPU Acceleration
3.切片
我本来想着是使用java调用 gdal 执行影像金字塔的构建,但是查了很多的资料,好像都没有具体的代码,更多的都是使用 python 进行切片,比如:
gdal2tiles
python写的gdal转成tiles工具,在四年前就停止更新了,可能就是整个的工具的作用都已经完成了吧。gdal2tiles将tif转瓦片 gdal瓦片切片工具
这篇文章也是使用了 python 进行了切片操作,是gdal2tiles 的改版,支持火星偏移、默认改为谷歌瓦片模式(/z/x/y),原来是/z/x/-y、支持瓦片压缩、需要安装gdal和pngquant(如果需要压缩的话)。一个简单的影像切片工具,生成xyz格式
这里写了一个工具,可以设置切片的路径,还有切片的层级,文章倒是用的java代码。
经过不懈的努力,最后我还是找不到更好的方案,只能用python了,虽然已经多年没有更新了,但是还是有人在用的。
【1】.TIF影像图进行切片处理及加载 1.tif格式介绍;2.tif格式介绍;3.常见问题;4.处理操作流程完整示例:准备好tif格式文件、准备好tif格式文件、发布三维数据为HTTP服务,因为地图瓦片数据一般都很大,建议将瓦片目录发布为http服务可以访问的一个站点,操作方式参考nginx、IIS、Tomcat等Http服务器操作说明, 可以参考教程发布三维数据服务
【2】.影像切片 1.影像切片。2.瓦片存储原理。3.任意范围瓦片。4.GeoTools切片思路。
【3】.基于geotools实现geotif切瓦片 这里用了 geotools 进行了图像切片,但是只是进行了切割,没有形成金字塔。
【4】.开源影像tif切图工具gdal2tiles部署以及切图 这里使用了 GDAL 进行了切片,还有GDAL的安装。1.下载gdal的whl文件安装包,下载版本跟本机安装的python版本匹配就行。2.运行测试gdal2tiles.py切图工具.
【5】.基于GDAL的影像切图工具 1.首先获取原始影像的地理坐标范围。2.获取原始影像的像素分辨率。3.根据原始影像地理范围求解切片行列号。4.求原始影像地理范围与指定缩放级别指定行列号的切片交集。5.求解当前切片的像素分辨率(默认切片大小为256*256)。6.计算交集的像素信息。7.使用GDAL的ReadRaster方法对影像指定范围进行读取与压缩。。8.将切片数据写入文件。9.读取临时文件,并转换成二进制存储到SQLite。
【6】.Java实现tif切片 这里只是把tif切成了小的png,没有进行层级组织。
【7】.java 集成gdal 进行切片 在进行切片之前,你需要打开要切片的数据源。数据源可以是一个图像文件、一个数据库或一个网络服务。你可以使用GDAL的gdal.Open()方法来打开数据源。在进行切片之前,你需要设置切片的参数,包括切片的范围、切片的大小和切片的格式等。你可以使用GDAL的gdal.TranslateOptions类来设置这些参数。
【8】.gdal栅格切图 这里使用的是 gdal 进行的切片,全部都是代码,没啥解释,然后执行了 sqlite 存储,问题出在就是没有如何创建 sqlite数据库和进行数据库连接的代码。
【9】.开源影像tif切图工具gdal2tiles部署以及切图
3.1.安装gdal
(1)windows 上安装
在新的地址上下载 gdal 的版本,安装,因为我的python版本是3.9,所以我选择了 GDAL-3.9.2-cp39-cp39-win_amd64.whl 这个版本。
1 | pip install GDAL-3.9.2-cp39-cp39-win_amd64.whl |
(2)linux上安装
直接使用 conda 安装,我也尝试使用 pip 安装,但是不成功,我尝试下载了 whl安装,结果也不行。
1 | conda install gdal |
【1】.通过【OSGeo4W】安装【gdal】库的流程与问题
【2】.Binaries 这个是 gdal 的官方安装说明。
【3】.linux 安装 gdal python 下载相应的GDAL-3.4.1-cp39-cp39-manylinux_2_5_x86_64.xxx.whl,然后安装
【4】.Linux系统中如何快速安装GDAL(gdal linux安装) 1.安装必要的依赖库;2.下载并安装GDAL库;3.安装Python相关GDAL依赖库;4.检查GDAL安装。
【5】.linux下python安装gdal库 使用pip安装,import会报错,每次还不一样,很难解决。直接使用 conda 安装。
3.2.安装 gdal2tiles
1 | pip install gdal2tiles |
【1】.gdal2tiles.py –xyz,生成XYZ平铺(OSM滑动贴图标准)而不是TMS。在默认模式(TMS)中,y=0处的瓦片是最南端的瓷砖,而在XYZ模式(OGC WMTS也使用)中,y=0处的瓷砖是最北端的瓦片。
3.3.切片
1 | import gdal2tiles |
3.4.进阶
继续的发展,就是使用改造的 gdal2tiles 进行切片。
4.发布
本来我想着要用静态文件 xyz png 格式进行存储,后来我发现,不少文章是直接存在 sqlite 数据库中的。Springboot发布/{z}/{x}/{y}.png地图瓦片服务 这里其实只是写了一个读取切片文件然后返回的例子,也就是说地图瓦片已经切好了,直接按照目录进行存储,然后读取就好了。就是使用上一步中用 gdal2tiles 进行切片后得到的数据,进行服务发布的过程。
1 | import com.sailen.tpm.modules.signal.config.TpmConfig; |
【1】.openlayers 加载nginx发布的松散型arcgis瓦片
【2】.Geo Atlas,用于构建矢量切片服务的Java基础库 Geo Atlas,译为地理地图册(地理地图集),就像小时候买到的纸质的地理地图册书本,里面填充着各式各样的地图。所以, 我也希望有那么一个东西,同样可以对外提供各种各样的地图以供使用。目前来说,他还只是一个基于Java的开发的,可用于快速构建矢量切片服务的基础库。
【3】.使用Java往Geoserver发布tif图层和shp图层
【4】.geotools实现wmts服务
【5】.java 集成gdal 进行切片 你可以使用GDAL的gdal.Translate()方法来执行切片操作。这个方法会将数据源切片为一系列的图像文件,并保存到指定的目录中。
【6】.GDAL2Tiles.java 这里的代码,我看着实际上使用的是java调用了python脚本,执行了切片操作。
【7】.gdal2tiles-2 gdal中python版gdal2tiles翻译为java版本,准备朝着MapTiler开发
【8】.切片的MBTiles格式和XYZ格式
【9】.Raster tile server using png data .mbtiles is the only supported input format.You can use e.g. MapTiler Desktop (
https://www.maptiler.com/desktop/
) to process your image into .mbtiles.(.mbtiles是唯一的输入格式,可以使MapTiler将图片转换为.mbtiles)5.前端加载
这里我使用了 vite,然后用了 openlayers 创建了一个请求。
1 | import './style.css'; |
【1】.Openlayers加载水晶注标准TMS瓦片 这里有方法
【2】.OpenLayers教程十二:多源数据加载之使用XYZ的方式加载瓦片地图 这里是加载的xyz方式
【3】.OpenLayers多源数据加载 1.利用XYZ加载OSM数据;2.利用XYZ加载百度地图。
【4】.OpenLayers教程十三:多源数据加载之详解OpenLayers的瓦片坐标系 1.通过自定义OpenLayers的瓦片坐标系来加载百度地图。2.分析瓦片地图的瓦片坐标系。3.加载Google中文地图。
【5】.openlayers 使用WMTS和XYZ加载天地图切片服务
【6】.openlayers学习(八)加载天地图各种底图 这里加载了天地图
【7】.GeoServer-权限认证-OpenLayers加载 这里用了 tileLoadFunction 设置了权限。
5.MbTiles
MbTiles不是一个数据库,其实是一种数据库规范,用在 SqlLite 数据库中。可以使用 mbtileserver 或者 tileserver-gl 将mbtiles格式的瓦片发布为服务。Vector and raster maps with GL styles. Server side rendering by MapLibre GL Native. Map tile server for MapLibre GL JS, Android, iOS, Leaflet, OpenLayers, GIS via WMTS, etc.
(1)元数据
该数据库必须包含一个名为metadata的表或视图。该表必须包含两个名为 name、format、bounds、center、minzoom、maxzoom。metadata表的典型 create 语句:1
CREATE table metadata (name text, value text);
(2)Tiles 瓦片
数据库必须包含一个表 named tiles,The 表 必须包含三行 one of type integer, named zoom_level, tile_column,tile_row, and one of type blob, named tile_data。1
CREATE table tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob);
注意:使用 TMS tiling scheme, 请求单个瓦片的y轴与 URL 中常用的“XYZ”坐标系相反,所以通常称为 11/327/791 的瓦片插入为 zoom_level 11、tile_column 327 和 tile_row 1256,因为 1256=2^11 - 1 - 791。
- (3)索引
数据库可以包含一个索引提高访问性能:1
CREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row);
【1】.MBTiles
【2】.GIS开发:如何开发一个MBTiles Server 首先,查看MBTiles数据库的结构,可以使用查看SQLite数据库的工具进行查看。一般是包含metadata和标示每张切片的缩放级别、行列号,表结构根据场景有些不同,但是,都具有可以根据缩放级别和行列号,直接查出来对应的切片图片。根据地图的请求url规则,查询MBTiles中的对应切片,进行返回,就能实现在地图端访问到地图切片了。
【3】.【地图缓存】MBTiles初步了解 MBTiles是一个在 SQLite 数据库存储瓦片地图数据的标准。MBTiles 仅支持切片数据,包括矢量、栅格瓦片,它使得数以百万的瓦片数据存储在一个文件中,而且SQLite数据库支持多种平台,MBTiles在移动设备上浏览瓦片数据有一定的优势。
【4】.mbtile-image-server 基于springboot实现,实现获取本地目录中的.mbtiles文件,发布成切片服务,支持图片格式切片(png\jpg),支持矢量格式切片(pbf)
【5】.mbtiles-server Provides a compatible WMTS Tile Server from MBTiles.
【6】.MapTiler 快速入门文档 MapTiler 提供了一套简单的解决方案,用于对任何具备地理参考的地图图像生成切片。这些切片可以用于网络地图服务。它遵循 Open Source Geospatial Foundation (OSGeo) 的 Tile Map Service (TMS) 标准。
【7】.python 创建 mbtiles 这里是使用的 python 创建 mbtiles 文件,然后插入了数据,这里有表结构可以参考。
【8】.【GIS开发】批量地图瓦片转mbtiles文件(Python) 精选 这也是地图瓦片转 mbtiles 文件。
【9】.MBTiles规范说明 中文版
【10】.【地图缓存】MBTiles初步了解
6.xyz转mbtiles
使用 xyz 格式,就是通用的格式,还可以转成 mbtiles 格式。
(1)已切好的地图瓦片存放在文件系统中,会产生大量的文件碎片,占用空间会比实际容量大很多。
(2)利用数据表里的byte来存储图片,使用时通过查询数据表就可以读取图片,优点是大大减少存储量,缺点是大量的查询会拖慢服务器,较适合离线地图使用。
【1】.QGIS制作xyz切片(mbtiles) MBTiles是由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范。它使得数以百万的瓦片数据存储在一个文件中,而且SQLite数据库支持多种平台,所以使用MBTiles在移动设备上浏览瓦片数据是比较理想的方式。
【2】.mbutil 这是mapbox写的一个工具,将xyz文件转为mbtiles。MBUtil is a utility for importing and exporting the MBTiles format, typically created with Mapbox TileMill.Before exporting tiles to disk, see if there’s a Mapbox Hosting plan or an open source MBTiles server implementation that works for you - tiles on disk are notoriously difficult to manage.
【3】.WebGISdata 构建mbtiles格式的矢量瓦片、栅格瓦片、地形瓦片以及使用OSM数据构建瓦片. 在数据处理过程中, 最难的是安装各种环境, 现在整合了一个Docker镜像, 包括 GDAL | tippecanoe | mbutil | osmium | rio-rgbify | dem2terrain | tilemaker 这些环境.
【4】.批量地图瓦片转mbtiles文件(Python) 这里也是用了 mbutil 这个工具,进行了截图和操作说明,还有调用。
【5】.arcgis紧凑型切片缓存(解决大范围切片,文件数量大的问题) 个人认为无论那种压缩或合并格式都会产生效率损失,因为各类普遍应用前端应用读写前都会解压翻译成标准格式,而解压翻译国产就会产生效率损失!所以如小范围还是xyz的切片格式最快。
【6】.ArcGIS紧凑型切片读取与应用3-紧凑型批量转分散型(附源码)
【7】.利用MBTiles技术原理减轻离线地图的存储量 这里用了java代码,读取了文件,形成byte,然后可以存储到服务器中。
【8】.GIS:MBTiles数据 1.MBTiles;2.SQLite中的MBTiles;3.数据生成:QGIS、tippecanoe、MBUtil。4.发布:GeoServer、mbtiles-server(by DenisCarriere)、mbtiles-server(by chelm)、TileServer GL。5.客户端调用:leaflet、openlayers、cesium。6.SMTiles格式数据,由于MBTiles格式数据限制性较多,超图推出了一种MBTiles的扩展格式SMTiles。
【9】.java中使用MBUtil工具将png转mbtiles mbutil工具除了需要瓦片数据外,还需要一个很重要的文件:metadata.json,该文件中最重要的一个参数就是bounds,在使用该工具前,先去根据你格网的原始层级以及行列号计算出坐标,注意:坐标顺序为左下右上。
【10】.开源地图用什么服务器好 1.MapServer;2.GeoServer;3.TileServer;4.Mapnik;5.OpenLayers;
问题
这里是我在使用和切片的时候遇到的问题。
1.metadata-generation-failed系统找不到指定文件
使用pip 安装 gdal2tiles 的时候就会报错,无法安装 gdal2tiles。出现:Requirements should be satisfied by a PEP 517 installer,error: [WinError 2] 系统找不到指定的文件。
【尝试解决】
(1)尝试安装,增加参数,结果无效
1 | pip install gdal2tiles --use-pep517 |
(2)我尝试使用了 OSGeo4W setup 安装了 gdal,已经安装成功了,但是不行。
(3)尝试使用 OSGeo4W 执行 gdal 安装。
下面是window的操作步骤,我执行了安装,gdal 也安装成功了,但是还是无法使用 gdal2tiles.
打开 OSGeo4W setup 程序,选择需要安装的 gdal 版本。
配置环境变量,C:\OSGeo4W\bin
执行验证
打开命令行,执行验证命令。1
gdalinfo --version
【解决方案】
在新的地址上下载 gdal 的版本,安装,因为我的python版本是3.9,所以我选择了 GDAL-3.9.2-cp39-cp39-win_amd64.whl 这个版本。
1 | # 安装 GDAL |
【1】.Propagate –use-pep517 to build-system requirements
【2】.阿里云安装python依赖报错 Requirements should be satisfied by a PEP 517 installer.
【3】.FileNotFoundError: [WinError 2] 系统找不到指定的文件
【4】.Having trouble installing GDAL for Python on Windows
【5】.python调用gdal2tiles实现栅格影像TMS切片
【6】.GDAL的wheel最新下载网址 这里给了问题解决方案。
2.Docker无法启动
windows上安装,还需要安装docker,如果安装了docker,可以直接使用docker。安装的时候倒是没有问题,就是开启Hyper-V,然后安装,但是启动的时候就出现了问题:Docker Desktop - WSL update failed错误。
【尝试解决】
(1)我尝试命令行执行,结果一直都为零,只能说网络不好。
1 | wsl --update |
(3) 使用下面的命令更新,结果不行,因为参数不对。
1 | wsl --install --web-download |
【解决方案】
增加参数,从网络下载,结果还是很慢。
1 | wsl --update --web-download |
经过一夜之后,后来甚至出现了:”与服务器的连接被重置“,这个问题,我再次重新执行命令的时候,结果显示 “已安装最新版本的适用于 Linux 的 Windows 子系统”,但是还是启动了Docker,不晓得到底哪里问题。
【1】.【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南 1.安装Hyper-V和WSL。2.安装Docker。还有解决无法启动Docker的问题,主要就是 wsl –update 命令。
【2】.wsl –update 进度一直为0
【3】.Manual installation steps for older versions of WSL
3.DATABASE.LAYOUT.VERSION.MINOR = 2 whereas a number >= 3 is expected
使用 gdal2tiles 进行切图的时候,结果出现了这个问题:PROJ: proj_create_from_database: C:\Program Files\PostgreSQL\15\share\contrib\postgis-3.4\proj\proj.db contains DATABASE.LAYOUT.VERSION.MINOR = 2 whereas a number >= 3 is expected
该问题源于GDAL和PostGIS插件对不同版本PROJ的依赖。解决方法是在代码中设置环境变量PROJ_LIB,指向Python安装目录下的PROJ库路径,从而避免环境变量的干扰,成功运行代码。
【解决方案】
我因为在 windos 上测试的,于是我就搜索了 proj 的目录,因为我的虚拟环境是 yolo,最后的路径就是如下:
1 | import os |
【1】.GDAL与PostGIS使用的PROJ库版本冲突问题解决方案 这里说明了问题。
【2】.python 查看pip install安装依赖路径 这里查看以来包的路径。
【3】.gdal设置proj_lib路径 这里在linux上设置了共享目录。
【4】.linux下安装 gdal环境与项目配置 这个没有用。
4.切片空白
我使用 gdal2tiles 切出来的总是空白的,开始的时候,总是不知道什么原因。
【尝试方案】
(1)我尝试了使用 profile 定义投影,结果无效。
(2)尝试 s_srs 参数定义投影,结果还是一样。
【解决方案】
后来我发现,是因为我的切片的级别太高了,我用无人机拍摄的图片,定义了一个 7-9 级,所以切出来的就是一个空白。
5.the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winpty’
我在使用 java 的 Runtime 执行命令的时候,出现了这个问题。
【尝试方案】
(1)我尝试增加 winpty ,结果不行。
1 | String cmd="winpty docker.exe run -it --rm -v "+photoPath+"/images:/code/images -v "+photoPath+"/odm_orthophoto:/code/odm_orthophoto opendronemap/odm"; |
(2)使用 commons-exec 执行,结果还是不行
1 | CommandLine commandLine = CommandLine.parse(cmd); |
(3)尝试使用 cmd 命令,结果无效。
1 | String cmd="docker run -it --rm -v "+photoPath+"/images:/code/images -v "+photoPath+"/odm_orthophoto:/code/odm_orthophoto opendronemap/odm"; |
【解决方案】
其实解决方案就是把这个参数进行调整一下,直接把这个 -it 参数去掉就可以了。
1 | String cmd="docker run --rm -v "+photoPath+"/images:/code/images -v "+photoPath+"/odm_orthophoto:/code/odm_orthophoto opendronemap/odm"; |
【1】.docker error on windows : the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winpty’ [duplicate] So just prefix with winpty winpty docker-compose exec workspace bash
【2】.【Docker 使用git bash运行错误】the input device is not a TTY. If you are using mintty, try prefixing 再Windows上运行 git bash 来执行docker命令,使用 -it参数时会报此错误,必须使用Windows自动的cmd命令才能分配新的终端! 切换powershell即可
【3】.java 直接执行docker 命令 这里就提到了使用 commons-exec 执行命令。
【4】.java如何调用docker 1.使用Docker Java客户端库。2.通过命令行调用Docker命令。3.使用容器编排工具。
【5】.在win10上安装docker之后使用git bash 或者xshell 操作时的问题 以及解决办法
【6】.JAVA代码执行CMD命令 RunTime.getRuntime().exec()
【7】.the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winpty’ 还是老老实实以管理员权限打开cmd,然后在运行就可以了,简单吧^^
【8】.报错解决:the input device is not a TTY 如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数。
6.java命令执行docker卡住
(1) 两个线程分别读取 标准输出 和 错误输出。
1 | public static boolean runCMD(String cmd) { |
(2) 另外一种写法,也是通过多线程清空输出内容
1 | /** |
【1】.java 执行cmd命令卡住
【2】.java执行命令行,以及解决卡死问题 一般程序的做法是先循环读正确的返回流,再读错误的返回流,当正确的返回流读不完的时候,有可能错误的返回流已经占满了缓存,所以导致了卡死。使用ProcessBuild类,这个类可以把错误流重定向到正确流,这样只读一个流就可以了,不论正确或错误,都能读到返回。
【3】.Java 执行 系统命令卡住 1.输入/输出流阻塞;2.命令等待输入;3.命令执行时间过长;
【4】.java执行cmd命令的两种方法 第二种方法是先生成一个缓存文件,用来缓存执行过程中输出的信息,这样在执行命令的时候不会卡
【5】.Java中Process和Runtime()使用,以及调用cmd命令阻塞解决 一直认为是getInputStream的缓冲区没有被清空,不过问题确实是缓冲区的内容没有被清空,但不是getInputStream的,而是getErrorStream的缓冲区,这样问题就得到解决了。所以我们在遇到java调用外部程序而导致线程阻塞的时候,可以考虑使用两个线程来同时清空process获取的两个输入流,如下这段程序
【6】.Values of process.exitValue() in JAVA That’s up to the process in question. Even the “0 means success” is a convention more than anything else - although it’s a very common one.
【7】.Runtime.getRuntime().exec踩坑总结(/bin/sh -c、异常流重定向) java.lang.Runtime#exec返回一个Process类,可用于控制命令执行的进程,比如获取标准输出流、标准输入流及异常流,获取该进程的执行状态,销毁该进程等。
7.java执行命令行权限问题
在 linux 上执行 runtime 命令,不使用root命令执行的时候,会出现权限的问题。
【解决方案】
后来我干脆就直接把用户加入了 docker 组,这样就方便了。
1 | sudo usermod -aG docker username |
8.Uh oh! Processing stopped because of strange values in the reconstruction. This is often a sign that the input data has some issues or the software cannot deal with it. Have you followed best practices for data acquisition
在windows上调试,没有问题,但是放到到服务器上,就出现了问题。
【解决方案】
其实我也没有解决,就是重新换了一台服务器运行,看看行不行。