https://blog.csdn.net/learn_tech/article/details/80827063
GeoPandas是一个开源项目,它的目的是使得在Python下更方便的处理地理空间数据。GeoPandas扩展了pandas的数据类型,允许其在几何类型上进行空间操作。几何操作由 shapely执行。 GeoPandas进一步依赖于 fiona进行文件存取和 descartes ,matplotlib 进行绘图。
Geopandas 依赖库
从 http://www.lfd.uci.edu/~gohlke/pythonlibs 下载 Fiona , GDAl , pyproj , Shapely
然后使用如下命令进行安装
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+
依赖包:
- numpy
- pandas (version 0.13 or later)
- shapely
- fiona
- six
- geopy 0.99 (optional; for geocoding)
- psycopg2 (optional; for PostGIS connection)
绘图的话会用到另外的一些包:
测试
从源目录下运行当前的测试集,在命令行运行:
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