地理数据分析常用工具
- shapely
- Point
- LineStrings
- LineRings
- Polygon
- geopandas
- Folium
- Kepler.gl
- GeoHash
shapely
shapely是python中开源的空间几何对象库,支持Point(点),LineString(线), Polygon(面)等几何对象及相关空间操作。
特性
几何对象可以和numpy.array互相转换。
可以轻松求线的长度(length),面的面积(area),对象之间的距离(distance),最小最大距离(hausdorff_distance)。
可以轻松求几何对象之间的关系:相交(intersect),包含(contain),求相交区域(intersection)等。
可以轻松对几何对象求几何中心(centroid),缓冲区(buffer),最小旋转外接矩形(minimum_rotated_rectangle)等。
可以求线的插值点(interpolate),可以求点投影到线的距离(project),可以求几何对象之间对应的最近点(nearestPoint)
可以轻松对几何对象进行旋转(rotate)和缩放(scale)。
#安装shapely
!pip install shapely
from shapely import geometry as geo
from shapely import wkt
from shapely import ops
import numpy as np
# 创建Point对象
pt1 = geo.Point([0,0])
print(pt1)
coord = np.array([0,1])
pt2 = geo.Point(coord)
print(pt2)
pt3 = wkt.loads("POINT(1 1)")
print(pt3)
#批量可视化
geo.GeometryCollection([pt1,pt2,pt3])
LineString
# 创建LineString对象
line1 = geo.LineString([(0,0),(1,-0.1),(2,0.1),(3,-0.1),(5,0.1),(7,0)])
line1
arr = np.array([(2,2),(3,2),(4,3)])
line2 = geo.LineString(arr)
line2
print(line2.length)
print(list(line2.coords))
print(np.array(line2)) #可以和np.array互转
print(line2.bounds) #坐标范围
几何对象关系
一个几何对象特征分别有interior、boundary和exterior。下面的叙述直接用内部、边界和外部等名词概述
1.object.contains(other)
如果object的外部没有其他点,或者至少有一个点在该object的内部,则返回True
a.contains(b)与 b.within(a)的表达是等价的
geopandas¶
GeoPandas提供了地理空间数据的高级接口,它让使用python处理地理空间数据变得更容易。GeoPandas扩展了pandas。)使用的数据类型,允许对几何类型进行空间操作。几何运算由shapely执行。Geopandas进一步依赖fiona进行文件访问,依赖matplotlib进行绘图。
import pandas as pd
import geopandas
import matplotlib.pyplot as plt
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))#read_file方法可以读取shape文件,转化为GeoSeries和GeoDataFrame数据类型。
world.plot()#将GeoDataFrame变成图形展示出来,得到世界地图
plt.show()
- 安装
conda install -c conda-forge geopandas
GeoPandas的核心数据结构是geopandas.GeoDataFrame,pandas.DataFrame能够存储几何列和执行空间操作的子类。几何由geopandas.GeoSeries的子类处理pandas.Series。因此,您GeoDataFrame是Series您的数据(数字,布尔值,文本等)和GeoSeries几何形状(点,多边形等)的组合。您可以根据需要拥有任意数量的具有几何形状的列,台式GIS软件通常没有限制。
读写文件
import geopandas
path_to_data = geopandas.datasets.get_path("nybb")
gdf = geopandas.read_file(path_to_data)
gdf
gdf.to_file("my_file.geojson", driver="GeoJSON")