如何使用Python获取地理TIFF影像

4

今天我遇到了麻烦,因为我第一次要处理TIFF文件,但出现了错误。我正在尝试获取欧洲污染物值的光栅图像,因此我不需要保留高分辨率的图像,只需保留可以操纵的数据即可。我的代码非常简单:

from __future__ import print_function
import numpy
import urllib2
from PIL import Image

f = open('./maccrasters/prova.tif','w')

fullMap = urllib2.urlopen("http://wdc.dlr.de/wdcservices/wcs.php?COVERAGE=17e72d93-76d9-4af6-9899-b7b04e2763c8&service=wcs&version=1.0.0&crs=epsg:4326&bbox=-25,30,45,70&RESX=0.1&RESY=0.1&request=getcoverage&format=application/x-tiff-32f&TIME=2015-12-13T00&elevation=0&OUTPUTFILENAME=17e72d93-76d9-4af6-9899-b7b04e2763c8_2015-12-13T00_0")

im = Image.open(fullMap) 

print(im.format, im.size, im.mode) # output is TIFF (700,400) F
im.show()
im.save(f, "TIFF")

系统返回了一个输出,但我找不到解决该错误的方法:
_TIFFVSetField: ./maccrasters/prova.tif: Invalid tag "TileOffsets" (not supported by codec).
Traceback (most recent call last):
  File "getrasters.py", line 20 in <module>
    im.save(f, "TIFF")
File "C:\Python27\lib\site-packages\PIL\Image.py", line 1665, in save
  save_handler(self, fp, filename)
File "C:\Python27\lib\site-packages\PIL\TiffImagePlugin.py", line 1307, in _save
  e = Image._getencoder(im.mode, 'libtiff', a, im.encoderconfig)
File "C:\Python27\lib\site-packages\PIL\Image.py",line 430, in _getencoder
  return encoder(mode, *args + extra)

RuntimeError: Error setting from dictionary

有人可以帮我吗?


1
这有帮助吗?https://dev59.com/5msz5IYBdhLWcg3w6MXn - Marco
@Marco,很遗憾,我无法使用.show()方法正确地可视化图像。这不仅是保存图像的问题。 - Lupanoide
2个回答

2

geoTiff

您的文件不是普通的tiff文件,而是需要使用特殊库的geoTiff文件。

对于Python,有georasters库可以读取这些文件。然后,您可以使用matplotlib显示它们。

在我看来,使用requests比urllib具有更好的界面:

import requests
from PIL import Image
import georasters as gr
import matplotlib.pyplot as plt


url = 'http://wdc.dlr.de/wdcservices/wcs.php'

query = {
    'COVERAGE': '17e72d93-76d9-4af6-9899-b7b04e2763c8',
    'service': 'wcs',
    'version': '1.0.0',
    'crs': 'epsg:4326',
    'bbox': '-25,30,45,70',
    'RESX': '0.1',
    'RESY': '0.1',
    'request': 'getcoverage',
    'format': 'application/x-tiff-32f',
    'TIME': '2015-12-13T00',
    'elevation': '0',
    'OUTPUTFILENAME': '17e72d93-76d9-4af6-9899-b7b04e2763c8_2015-12-13T00_0'
}

with open('test.tiff', 'wb') as f:

    ret = requests.get(url, stream=True, params=query)
    for data in ret.iter_content(1024):
        f.write(data)

data = gr.from_file('test.tiff')

plt.imshow(data.raster, cmap='gray')
plt.show()

结果: 结果

谢谢您的回答,但对我来说并不起作用:我不知道为什么,我已经下载了它,但我只能看到图像的一部分 - 只有北欧,而不是完整的图像,就像一个瓷砖。 - Lupanoide
不,问题在于Python以及如何打开它。如果我手动下载这个图像,将URL放入浏览器中,我可以正常查看它,但文件保存为.php文件。 - Lupanoide
即使在Python3中调用im.show()也会抛出错误,在Python2中没有错误但缺少部分。 - MaxNoe
你用浏览器下载后,如何打开它?我无法打开。 - MaxNoe
1
非常感谢你,Max!下载这些文件对我的项目非常重要,没有你我无法解决这个问题。你今天是我的英雄! - Lupanoide
显示剩余3条评论

0

我也曾经处理过 .tiff 图像

我使用的是来自 openCVimread,效果非常好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接