目录
地理数据分析常用工具
- shapely
- Point
- LineStrings
- LineRings
- Polygon
- geopandas
- Folium
安装
1. GDAL
2. Shapely
3. Finoa
4. pyproj
5. geopandas
一定要按顺序装,否则容易报错
学过Python的朋友都知道使用pip install xxx是最方便的,但是有些第三方库不能使用此方法安装。所以要借助whl文件
-
先进入Python Extension Packages for Windows下载whl文件
-
第一次进来可能会很懵,不要慌。直接Ctrl+F键搜索需要安装包的名字。如:GDAL
可以看到,所有包含GDAL的地方都被高亮了。 -
选择与你电脑系统和python版本匹配的whl文件。
如:本人的是win10 64位 python3.8,所以选择GDAL‑3.2.2‑cp38‑cp38‑win_amd64.whl -
下载后在cmd中,输入pip install 文件名,这里不要手动输入,本人输入的是pip install GDAL 导致安装出错。
我采用的是在cmd中写dir命令,然后复制名字进行安装。或者直接将下载的文件拖入cmd就可自动输入
同理,依次安装Shapely、Finoa、pyproj
最后pip install geopandas
检验是否安装成功
import sys
"geopandas" in sys.modules
返回True
测试一下
import geopandas as gp
import matplotlib.pyplot as plt
world = gp.read_file(gp.datasets.get_path("naturalearth_lowres"))
world.plot()
plt.show()
可以生成地图则证明没问题
使用
1.Shapely
from shapely import geometry as geo
point = geo.Point(0,0) #生成点
point1 = geo.Point(0,1)
point2 = geo.Point(1,0)
line = geo.LineString([point,point1,point2]) #生成线
point3 = geo.Point(1,1)
geo.GeometryCollection([line,point3]) #生成几何图形集合
# 点到线的垂直距离
point3.distance(line)
# 点到线的最长距离
point3.hausdorff_distance(line)
# 面积
line.area # 线的面积为0
# 坐标范围
line.bounds # 返回(minx, miny, maxx, maxy)
# 长度
line.length
# 几何图形的类型
line.geom_type
# 几何对象的各个坐标
list(line.coords) # 返回[(0.0, 0.0), (0.0, 1.0), (1.0, 0.0)]
# 最小外接矩阵
line.envelope
# 最小旋转外接矩阵
geo.GeometryCollection([line,line.minimum_rotated_rectangle])
# 插值
pt_half = line.interpolate(0.5,normalized=True)
geo.GeometryCollection([line,pt_half])
line.project(pt_half,normalized=True) # project方法与interpolate互逆
返回0.5
环
ring = geo.polygon.LinearRing([(0,0),(1,1),(1,0)])
ring.length # 长度
ring.area # 因为环的根本是线,所以面积为0
思考:
LineString和LinearRing用起来有什么区别?
Polygon 多边形
polygon1 = Polygon([(0,0),(1,1),(1,0)]) # 生成多边形
print(polygon1.area)
print(polygon1.length)
ext = [(0,0),(0,2),(2,2),(2,0),(0,0)] # 外边
int = [(1,0),(0.5,0.5),(1,1),(1.5,0.5)] # 洞的范围
polygon2 = Polygon(ext,[int]) # ext为有序的point元组,int为内部边距
print(polygon2.area) # ext的面积减去int的面积
print(polygon2.length) # ext的长度加上int的长度
print("\n",polygon2.exterior)
print(type(polygon2.exterior)) # 类型为环,LinearRing
print(np.array(polygon2.exterior))
print(polygon2.interiors)
print(type(polygon2.interiors)) # 类型为环序列,InteriorRingSequence
# print(np.array(polygon2.interiors)) 不能使用该方法获得坐标
polygon2
2.geopandas
import pandas as pd
import geopandas
import matplotlib.pyplot as plt
world = geopandas.read_file(geopandas.datasets.get_path("naturalearth_lowres"))# GeoDataFrame
fig,ax = plt.subplots(figsize=(9,6),dpi=100)
world.plot("pop_est",ax=ax,legend=True)