Fiona是OGR为Python程序员提供的整洁、灵活的API。
Fiona设计简单可靠。它专注于以标准的python io样式读取和写入数据,并且依赖于熟悉的python类型和协议,如文件、字典、映射和迭代器,而不是特定于ogr的类。Fiona可以使用多层地理信息系统格式和压缩虚拟文件系统读取和写入现实世界数据,并且可以与其他pyropj、rtree和shapely等python地理信息系统包轻松集成。Fiona仅在CPython版本2.7和3.4+上受支持。
有关详细信息,请参阅:
记录的读取和写入 file
似 Collection 从返回的对象 fiona.open()
功能。记录是基于geojson格式建模的映射。它们没有自己的空间方法,所以如果你想对它们做些有趣的事情,你可能需要形状或者类似的东西。下面是一个使用fiona从一个数据文件中读取一些记录、更改其几何属性并将其写入新数据文件的示例。
import fiona
# Open a file for reading. We'll call this the "source."
with fiona.open('tests/data/coutwildrnp.shp') as src:
# The file we'll write to, the "destination", must be initialized
# with a coordinate system, a format driver name, and
# a record schema. We can get initial values from the open
# collection's ``meta`` property and then modify them as
# desired.
meta = src.meta
meta['schema']['geometry'] = 'Point'
# Open an output file, using the same format driver and
# coordinate reference system as the source. The ``meta``
# mapping fills in the keyword parameters of fiona.open().
with fiona.open('test_write.shp', 'w', **meta) as dst:
# Process only the records intersecting a box.
for f in src.filter(bbox=(-107.0, 37.0, -105.0, 39.0)):
# Get a point on the boundary of the record's
# geometry.
f['geometry'] = {
'type': 'Point',
'coordinates': f['geometry']['coordinates'][0][0]}
# Write the record out.
dst.write(f)
# The destination's contents are flushed to disk and the file is
# closed when its ``with`` block ends. This effectively
# executes ``dst.flush(); dst.close()``.
还可以从多层文件或数据目录中的单层进行收集。目标层由文件或目录中的名称或其整数索引指定。这个 fiona.listlayers()
函数提供按索引排序的层名称列表。
for layername in fiona.listlayers('tests/data'):
with fiona.open('tests/data', layer=layername) as src:
print(layername, len(src))
# Output:
# (u'coutwildrnp', 67)
层也可以通过索引指定。在这种情况下, layer=0
和 layer='test_uk'
在数据文件或目录中指定相同的层。
for i, layername in enumerate(fiona.listlayers('tests/data')):
with fiona.open('tests/data', layer=i) as src:
print(i, layername, len(src))
# Output:
# (0, u'coutwildrnp', 67)
多层数据也可以写入。写入时必须按名称指定层。
with open('tests/data/cowildrnp.shp') as src:
meta = src.meta
f = next(src)
with fiona.open('/tmp/foo', 'w', layer='bar', **meta) as dst:
dst.write(f)
print(fiona.listlayers('/tmp/foo'))
with fiona.open('/tmp/foo', layer='bar') as src:
print(len(src))
f = next(src)
print(f['geometry']['type'])
print(f['properties'])
# Output:
# [u'bar']
# 1
# Polygon
# OrderedDict([(u'PERIMETER', 1.22107), (u'FEATURE2', None), (u'NAME', u'Mount Naomi Wilderness'), (u'FEATURE1', u'Wilderness'), (u'URL', u'http://www.wilderness.net/index.cfm?fuse=NWPS&sec=wildView&wname=Mount%20Naomi'), (u'AGBUR', u'FS'), (u'AREA', 0.0179264), (u'STATE_FIPS', u'49'), (u'WILDRNP020', 332), (u'STATE', u'UT')])
/tmp/foo目录的视图将确认新文件的创建。
$ ls /tmp/foo
bar.cpg bar.dbf bar.prj bar.shp bar.shx
Zip和tar归档文件可以被视为虚拟文件系统,并且可以从其中的路径和层进行收集。换句话说,fiona允许您读取和写入压缩形状文件。
for i, layername in enumerate(
fiona.listlayers('zip://tests/data/coutwildrnp.zip'):
with fiona.open('zip://tests/data/coutwildrnp.zip', layer=i) as src:
print(i, layername, len(src))
# Output:
# (0, u'coutwildrnp', 67)
Fiona还可以从更奇特的文件系统中读取。例如,可以像这样访问S3中的压缩形状文件:
with fiona.open('zip+s3://mapbox/rasterio/coutwildrnp.zip') as src:
print(len(src))
# Output:
# 67
Fiona的命令行接口,名为“fio”,记录在 docs/cli.rst . 它的 fio info
漂亮的打印数据文件的信息。
$ fio info --indent 2 tests/data/coutwildrnp.shp
{
"count": 67,
"crs": "EPSG:4326",
"driver": "ESRI Shapefile",
"bounds": [
-113.56424713134766,
37.0689811706543,
-104.97087097167969,
41.99627685546875
],
"schema": {
"geometry": "Polygon",
"properties": {
"PERIMETER": "float:24.15",
"FEATURE2": "str:80",
"NAME": "str:80",
"FEATURE1": "str:80",
"URL": "str:101",
"AGBUR": "str:80",
"AREA": "float:24.15",
"STATE_FIPS": "str:80",
"WILDRNP020": "int:10",
"STATE": "str:80"
}
}
}
Fiona需要python 2.7或3.4+和GDAL/OGR 1.8+。要从源发行版构建,您需要一个C编译器和gdal和python开发头文件和库(libgdal1 dev用于debian/ubuntu,gdal dev用于centos/fedora)。
要从存储库副本构建,您还需要Cython从项目的.pyx文件构建C源。有关指导,请参见项目的requirements-dev.txt文件。
这个 Kyngchaos GDAL frameworks 将满足对OS X的GDAL/OGR依赖性,就像自制的gdal公式一样( brew install gdal
)
FIONA取决于模块 enum34
, six
, cligj
, munch
, argparse
和 ordereddict
(后两个模块是Python2.7+中的标准模块)。PIP将为您获取这些要求,但从Windows安装程序安装FIONA的用户必须分别获得这些要求。
假设您使用的是virtualenv(如果不是,请跳到第四个命令)和GDAL/OGR库、头文件和 gdal-config 程序通过系统的包管理器安装到系统上的已知位置。( brew install gdal
在OS X上使用自制),安装非常简单。
$ mkdir fiona_env
$ virtualenv fiona_env
$ source fiona_env/bin/activate
(fiona_env)$ pip install fiona
如果gdal config不可用,或者GDAL/OGR头文件和lib未安装到已知位置,则必须通过如下所示的setup.cfg文件或setup命令行设置include dirs、library dirs和libraries选项(使用 git
)还必须在命令行上使用 --gdalversion
参数(见下面的示例)或 GDAL_VERSION
环境变量(例如 export GDAL_VERSION=2.1
)
(fiona_env)$ git clone git://github.com/Toblerity/Fiona.git
(fiona_env)$ cd Fiona
(fiona_env)$ python setup.py build_ext -I/path/to/gdal/include -L/path/to/gdal/lib -lgdal install --gdalversion 2.1
或者指定由特定的gdal配置程序提供构建选项和gdal api版本。
(fiona_env)$ GDAL_CONFIG=/path/to/gdal-config pip install fiona
二进制安装程序可在http://www.lfd.uci.edu/~gohlke/pythonlibs/fiona上找到,并最终进入pypi。
您可以从下载gdal的二进制发行版 here . 您还需要下载已编译的库和头文件(包括文件)。
在Windows上从源代码构建时,重要的是要知道setup.py不能依赖仅在UNIX系统上存在的gdal config来发现fiona编译其C扩展所需的头文件和库的位置。在Windows上,这些路径需要由用户提供。您需要找到gdal的include文件和库文件,并使用如下的setup.py。还必须在命令行上使用 --gdalversion
参数(见下面的示例)或 GDAL_VERSION
环境变量(例如 set GDAL_VERSION=2.1
)
$ python setup.py build_ext -I<path to gdal include files> -lgdal_i -L<path to gdal library> install --gdalversion 2.1
注意:gdal dll( gdal111.dll
或者类似的)和gdal数据目录需要在Windows路径中,否则fiona将无法工作。
[appveyor ci build](https://ci.appveyor.com/project/sgilles/fiona/history)使用gisinternals gdal二进制文件来构建fiona。这将为想要尝试不稳定开发版本的用户生成一个成功构建的二进制车轮,其中包括gdal和其他依赖项。[appveyor配置文件](appveyor.yml)对于用户在Windows上从源代码构建可能是一个有用的示例。
从源头上建造需要赛通。试验要求 pytest . 如果GDAL/OGR库、头和 gdal-config 程序安装到系统上的已知位置(通过系统的包管理器),可以执行以下操作:
(fiona_env)$ git clone git://github.com/Toblerity/Fiona.git
(fiona_env)$ cd Fiona
(fiona_env)$ pip install cython
(fiona_env)$ pip install -e .[test]
(fiona_env)$ py.test
或者你可以使用 pep-518-install
脚本::
(fiona_env)$ git clone git://github.com/Toblerity/Fiona.git
(fiona_env)$ cd Fiona
(fiona_env)$ ./pep-518-install
如果您有一个非标准环境,则需要在命令行上指定include和lib dirs以及gdal库::
(fiona_env)$ python setup.py build_ext -I/path/to/gdal/include -L/path/to/gdal/lib -lgdal --gdalversion 2 develop
(fiona_env)$ py.test
所有问题编号都与https://github.com/toblerity/fiona/issues相关。
错误修复:
错误修复:
这是最终的1.8.0版本。谢谢大家!
错误修复:
除了更多的测试标准化和引入临时测试收集模块来支持Travis CI上完全测试的python 2.7 Macosx车轮的构建之外,1.8rc1中没有任何变化。
错误修复:
重构:
Deprecations:
错误修复:
重构:
Deprecations:
fiona.drivers()
上下文管理器被正式否决。所有用户应切换到 fiona.Env()
它以可逆的方式注册格式驱动程序并管理gdal配置。错误修复:
新功能:
MemoryFile
类,它支持格式化的内存中功能集合(501)。fio rm
命令可以清除多文件数据集(538)。gdal_open_vector()
我们内部API的功能提供了大大改进的错误处理(557)。错误修复:
AttributeError
当 --bbox
FIO CAT选项与多个已修复的输入文件一起使用(543,544)。新功能:
writerecords()
涉及一个或多个事务,每个事务具有最多20000个功能。这提高了写入地理数据包文件时的性能,因为以前的事务大小只有200个功能(476,491)。包:
encoding
的关键字参数 fiona.open()
它旨在允许调用者覆盖数据源自己的可能错误的编码,但尚未工作(510,512)。问题是,在打开数据源之前,我们并不总是设置gdal open或config选项。这个bug由maint-1.7分支中的多个提交解决,修复过程在tests/test_encoding.py中演示。--encoding
选项已添加到FIO加载中,以允许创建带.cpg文件(499,517)的编码形状文件。错误修复:
rio cat --layers
验证程序已被删除(478)。包:
此版本不引入fiona包中的任何更改。它将gdal从2.2.0升级到2.2.1,并将其发布到python包索引中。
错误修复:
错误修复:
错误修复:
错误修复:
玫瑰是红色的。Tan是个傻瓜。软件回归是最令人尴尬的错误。
错误修复:
未来折旧:
错误修复:
错误修复:
打包:为“干净”和“配置”目标定义扩展模块(363)。
打包:没有为“干净”设置目标(361,362)复制任何文件。
这个库中的C扩展模块现在可以构建并与gdal库的1.x或2.x版本一起使用。非常感谢任_布法特领导这项工作。
重构:
包:
特别感谢WFMU DJ Liz Berg为我的发布冲刺加油的精彩播放列表。请访问http://wfmu.org/playlists/show/62083查看。你听不懂爱情棺材。
写Fiona:
Geopandas项目(Joris van den Bossche等人)是1.8.0中新功能的主要驱动因素。
没有FrankWarmerdam和其他GDAL/OGR开发人员的出色工作,Fiona是不可能实现的。
这项工作的一些部分得到了美国国家人文基金会(http://www.neh.gov)的资助(用于Pleiades)。