如何使用 python 抓取地理 TIFF 图像
How to grab a geo TIFF image with python
今天我遇到了麻烦,因为这是我第一次使用 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")
系统 returns 给我一个输出,但我找不到该错误的解决方案:
_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
有人可以帮助我吗?
我也处理过 .tiff
张图片
我用的是openCV
的imread,效果很好
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()
结果:
今天我遇到了麻烦,因为这是我第一次使用 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")
系统 returns 给我一个输出,但我找不到该错误的解决方案:
_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
有人可以帮助我吗?
我也处理过 .tiff
张图片
我用的是openCV
的imread,效果很好
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()
结果: