软件研究之GDAL

标签: 无 分类: 未分类 创建时间:2023-08-16 02:29:40 更新时间:2025-01-17 10:39:24

前言

gdal是一个GIS中非常重要的软件。

1.MacOS

gdal就是地理处理数据库,在windows上可以通过 OSGeo4w 进行安装,时间还是挺长的。

1
2
3
4
5
# 安装
brew install gdal

# 查看安装,输出:GDAL 3.7.1, released 2023/07/06
gdalinfo --version
参考文章:
1.MAC下安装GDAL库 问题1:当输入sudo -s 获得超级用户。问题2:当更新homebrew时候,在终端中输入brewupdate命令。
2.mac gdal安装 1.在mac系统中安装gdal类库。2.安装Python gdal模块。
3.mac gdal安装 也可以通过conda安装:conda install -c conda-forge gdal

2.Windows

(1) 去官网下载 安装包 然后进行安装就可以了。

(2) 选择Advanced Install安装,

一路next配置之后,选择需要安装的包,选择gdal-filegdb,把前面的选择框打岔就可以了。

(3) 安装完gdal-filegdb之后,返回安装界面,选择 Express 安装,选择 GDAL进行安装,不进行这一步,就不会出现 ogr 命令

(3) 安装之后,会在桌面生成文件夹,里面有 OSGeo4W Shell ,打开就可以了。

3.使用

安装之后,可以使用ogr2ogr 命令将 gdb 数据库导入都postgis中。

1
ogr2ogr -f "PostgreSQL" PG:"host=localhost port=5432 user=postgres password=xxx dbname=yyy" D:/data/geodata.gdb -overwrite -progress --config PG_USE_COPY YES

4.正射影像

5.获取经纬度范围

在下面的代码中,dataset.GetGeoTransform()方法返回一个包含6个浮点数的元组,分别表示地理空间数据的左上角x坐标、像素宽度、旋转角度、左上角y坐标、旋转角度和像素高度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from osgeo import gdal


def getSRSPair(dataset):
'''
获得给定数据的投影参考系和地理参考系
:param dataset: GDAL地理数据
:return: 投影参考系和地理参考系
'''
prosrs = osr.SpatialReference()
prosrs.ImportFromWkt(dataset.GetProjection())
geosrs = prosrs.CloneGeogCS()
return prosrs, geosrs

def geo2lonlat(dataset, x, y):
'''
将投影坐标转为经纬度坐标(具体的投影坐标系由给定数据确定)
:param dataset: GDAL地理数据
:param x: 投影坐标x
:param y: 投影坐标y
:return: 投影坐标(x, y)对应的经纬度坐标(lon, lat)
'''

prosrs, geosrs = self.getSRSPair(dataset)
ct = osr.CoordinateTransformation(prosrs, geosrs)
coords = ct.TransformPoint(x, y)
return coords[:2]

dataset = gdal.Open(tifName) # 打开tif
adfGeoTransform = dataset.GetGeoTransform() # 读取地理信息

x = adfGeoTransform[0]
y = adfGeoTransform[3]
coords = self.geo2lonlat(dataset, x, y) # 左上角坐标

iCol = dataset.RasterXSize #列数
iRow = dataset.RasterYSize #行数
dProjX = adfGeoTransform[0] + adfGeoTransform[1] * iCol + adfGeoTransform[2] * iRow
dProjY = adfGeoTransform[3] + adfGeoTransform[4] * iCol + adfGeoTransform[5] * iRow
coords2 = self.geo2lonlat(dataset, dProjX, dProjY) # 右下角坐标
参考文章:
【1】.python使用gdal读取tif经纬度 dataset.GetGeoTransform() # 读取地理信息
【2】.Python+GDAL 图像坐标、地理坐标、投影坐标的相互转化 这里有投影坐标和地理坐标进行相互转换的方案,还有图像坐标
【3】.关于GDAL计算图像坐标的几个问题 这里就可以很简单的来进行图像的行列号与地理坐标进行相互转换,具体的代码如下,共有两个,一个正算,一个反算。
【4】.GDAL获取栅格数据各个像素对应的经纬度(Python版)

问题

为了将arcmap的文件地理数据导入到postgis中,使用了OSGeo4W这个工具,安装方法可见我的另一篇文章:文章标题(可选),这次的主要问题是,在使用ogr2ogr命令行时,出现了不知道的错误。

还有这种错误:

问题的解决,主要是通过成功安装了postgis。以前没有成功安装过postgis,安装完postgre之后,在安装postgis,执行create extension postgis;就会报:无法加载库 “C:/Program Files/PostgreSQL/10/闪电b/rtpostgis-2.5.dll” 的错误,也就是不能创建空间数据库。

这个问题主要是postgis的版本和postgre版本不一致所造成的,但是我下载的版本都是再管网下的,pg11,我就去postgis文件夹的pg11文件夹下载2.5.2版本,结果还是不行。最后,是通过别人安装成功的软件,安装了pg10 +postgis 2.4.4(管网没有这个版本的下载)。安装完postgre和postgis之后,最后再执行用OSGeo4W这个工具将gdb导入到postgis就可以了。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。