美文网首页
008geopandas

008geopandas

作者: 桃子味的白开水 | 来源:发表于2019-12-20 15:53 被阅读0次

https://blog.csdn.net/learn_tech/article/details/80827063

GeoPandas是一个开源项目,它的目的是使得在Python下更方便的处理地理空间数据。GeoPandas扩展了pandas的数据类型,允许其在几何类型上进行空间操作。几何操作由 shapely执行。 GeoPandas进一步依赖于 fiona进行文件存取和 descartesmatplotlib 进行绘图。

Geopandas 依赖库

http://www.lfd.uci.edu/~gohlke/pythonlibs 下载 Fiona , GDAl , pyproj , Shapely

image.png
然后使用如下命令进行安装
pip install E:\Repository\python\Fiona-1.8.13-cp37-cp37m-win_amd64.whl

其他包可以通过 pip install geopandas 安装

描述

GeoPandas 的目的是在Python下更容易处理地理数据。它结合了pandas和shaply的功能,提供在pandas下的空间操作和shapel下高层次的处理多几何构型的接口。GeoPandas 允许你很容易的用Python进行操作,不然的话,你将不得不用一个空间数据库去处理,如PostGIS。

安装

笔者目前的发现版本是0.1,安装,可以使用pip或easy_install:

pip install geopandas

你也可以通过克隆 GitHub上的仓库去安装最新的开发版本,命令脚本如下:

git clone https://github.com/geopandas/geopandas.git
cd geopandas
python setup.py install

同样也可以在PyPI上安装最新的可用开发版本,使用pip,加上--pre安装1.4或者更高的版本,或者直接使用pip从GitHub仓库中安装:

pip install git+git://github.com/geopandas/geopandas.git

依赖

支持Python版本2.6,2.7,和3.2+

依赖包:

绘图的话会用到另外的一些包:

测试

从源目录下运行当前的测试集,在命令行运行:

nosetests -v

测试自动运行在GitHub库中所有的提交事务上,包括在Travis CI的push请求。

GeoPandas 使用手册

GeoPandas实现了两个主要的数据结构,GeoSeries和GeoDataFrame。它们分别是pandas中Series和DataFrame的子类。

GeoSeries

一个GeoSeries包含一个几何图形的序列。

GeoSeries类实现了几乎所有的Shapely对象的属性和方法。在使用GeoSeries时,它将应用于序列中所有几何图形的每一个元素。二元操作可以在两个GeoSeries对象之间进行,这种情况下二元操作将应用于每一个元素。这两个序列将按匹配的索引进行对于操作。二元操作也可以应用于单个几何,此时二元操作将对该几何序列的每个元素进行。在以上两种情况下,操作将会返回Series或者GeoSeries对象。

在GeoSeries对象中,以下Shapely对象的方法和属性是可以使用的:
GeoSeries.area

返回一个Series,它包含GeoSeries中每个几何的面积。

GeoSeries.bounds

返回一个DataFrame,它包含每个几何的边界,用列值minx,miny,maxx,maxy来表示。

GeoSeries.length

返回一个Series,它包含每个几何的长度。

GeoSeries.geom_type

返回一个字符串的Series,字符串指定每个对象的几何类型。

GeoSeries.distance(other)

返回一个Series,它包含与其他GeoSeries对象(每个元素)或几何对象的最小距离。

GeoSeries.representative_point()

返回所有点的一个GeoSeries(经简易计算),这些点必须保证在每个几何的内部。

GeoSeries.exterior

返回线环(LinearRings)的一个GeoSeries,它表示GeoSeries中每个多边形的外边界。

GeoSeries.interior

返回内部环序列的一个GeoSeries,它表示GeoSeries中每个多边形的内部环。

一元谓词操作

GeoSeries.is_empty

返回一个布尔型的Series,对于一个空的几何图形,该值就为True。

GeoSeries.is_ring

返回一个布尔型的Series,对于闭合的要素,该值就为True。

GeoSeries.is_simple

返回一个布尔型的Series,如果几何体自身不交叉,该值就为True(仅对线串--LineStrings和线环--LineRings有意义)。

GeoSeries.is_valid

返回一个布尔型的Series,如果几何体是有效的,该值就为True。

二元谓词操作

示例

>>> p1 = Polygon([(0, 0), (1, 0), (1, 1)])
>>> p2 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
>>> p3 = Polygon([(2, 0), (3, 0), (3, 1), (2, 1)])
>>> g = GeoSeries([p1, p2, p3])
>>> g
    0 POLYGON ((0.0000000000000000 0.000000000000000...
    1 POLYGON ((0.0000000000000000 0.000000000000000...
    2 POLYGON ((2.0000000000000000 0.000000000000000...
    dtype: objec

[图片上传失败...(image-824711-1575962477204)]

一些地理操作返回标准的pandas对象。一个GeoSeries对象的area属性将会返回一个pandas.Series,它包含GeoSeries中每一项的面积。

>>> print g.area
    0 0.5
    1 1.0
    2 1.0
    dtype: float64

其他操作返回GeoPandas对象:

>>> g.buffer(0.5)
    Out[15]:
    0 POLYGON ((-0.3535533905932737 0.35355339059327...
    1 POLYGON ((-0.5000000000000000 0.00000000000000...
    2 POLYGON ((1.5000000000000000 0.000000000000000...
    dtype: object

[图片上传失败...(image-594da9-1575962477204)]

GeoPandas对象能后绘制这些图像。GeoPandas 使用descartes ,用matplotlib库绘制。为生产我们的GeoSeries图形,使用以下命令:

>>> g.plot()

GeoPandas也实现了替代构造函数,能够读取被fiona识别的格式。为读取包含纽约市镇文件(file containing the boroughs of New York City):

>>> boros = GeoDataFrame.from_file('nybb.shp')
>>> boros.set_index('BoroCode', inplace=True)
>>> boros.sort()
>>> boros
    BoroName Shape_Area Shape_Leng \
    BoroCode
    1 Manhattan 6.364422e+08 358532.956418
    2 Bronx 1.186804e+09 464517.890553
    3 Brooklyn 1.959432e+09 726568.946340
    4 Queens 3.049947e+09 861038.479299
    5 Staten Island 1.623853e+09 330385.036974

    geometry
    BoroCode
    1 (POLYGON ((981219.0557861328125000 188655.3157...
    2 (POLYGON ((1012821.8057861328125000 229228.264...
    3 (POLYGON ((1021176.4790039062500000 151374.796...
    4 (POLYGON ((1029606.0765991210937500 156073.814...
    5 (POLYGON ((970217.0223999023437500 145643.3322...

[图片上传失败...(image-228c36-1575962477204)]

>>> boros['geometry'].convex_hull
    0 POLYGON ((915517.6877458114176989 120121.88125...
    1 POLYGON ((1000721.5317993164062500 136681.7761...
    2 POLYGON ((988872.8212280273437500 146772.03179...
    3 POLYGON ((977855.4451904296875000 188082.32238...
    4 POLYGON ((1017949.9776000976562500 225426.8845...
    dtype: object

[图片上传失败...(image-9e460d-1575962477204)]

为展示更复杂的操作,我们生产包含2000个随机点的一个GeoSeries:

>>> from shapely.geometry import Point
>>> xmin, xmax, ymin, ymax = 900000, 1080000, 120000, 280000
>>> xc = (xmax - xmin) * np.random.random(2000) + xmin
>>> yc = (ymax - ymin) * np.random.random(2000) + ymin
>>> pts = GeoSeries([Point(x, y) for x, y in zip(xc, yc)])

现在在每个点周围按固定的半径绘制圆:

>>> circles = pts.buffer(2000)

我们可以使用以下命令使这些圆合并成单个shapely的MutiPolygon几何对象:

>>> mp = circles.unary_union

提取在每个区内的上一步生成的几何对象的部分,可以使用:

>>> holes = boros['geometry'].intersection(mp)

[图片上传失败...(image-dc09ef-1575962477204)]

并且可以得到区域内这些部分以外的其他部分面积:

>>> boros_with_holes = boros['geometry'].difference(mp)

[图片上传失败...(image-c55079-1575962477203)]

注意,这个可以简化一点,因为geometry可以在GeoDataFrame中作为属性得到,intersection和difference方法分别是由“&”和“-”操作符实现的。例如,后者可以简单的表示为boros.geometry -mp。

计算每个区中这些由点缓冲生成的holes的比例,是很容易做到的

>>> holes.area / boros.geometry.area
    BoroCode
    1 0.602015
    2 0.523457
    3 0.585901
    4 0.577020
    5 0.559507
    dtype: float64

相关文章

  • 008geopandas

    https://blog.csdn.net/learn_tech/article/details/80827063...

网友评论

      本文标题:008geopandas

      本文链接:https://www.haomeiwen.com/subject/dpdggctx.html