- geojson数据结构
- geojson作图方法
- geojson与pandas
数据结构
GeoJSON是用于表示地理对象的格式。 它与常规JSON不同,因为它支持几何类型,例如:Point,LineString,Polygon,MultiPoint,MultiLineString,MultiPolygon和GeometryCollection。
使用GeoJSON,使可视化瞬间变得更加容易,您将在后面的部分中看到。 这主要是因为GeoJSON允许我们将集合的几何数据类型存储在一个中央结构中。
GeoPandas是一个Python模块,用于通过扩展Python模块Pandas使用的数据类型来简化在python中的地理空间数据,以允许对几何类型进行空间操作。 如果你不熟悉Pandas,请查看其教程。
GeoJSON 是用于描述地理空间信息的数据格式。GeoJSON 不是一种新的格式,其语法规范是符合 JSON 格式的,只不过对其名称进行了规范,专门用于表示地理信息。
GeoJSON 的最外层是一个单独的对象(object)。这个对象可表示:
几何体(Geometry)。
特征(Feature)。
特征集合(FeatureCollection)。
最外层的 GeoJSON 里可能包含有很多子对象,每一个 GeoJSON 对象都有一个 type 属性,表示对象的类型,type 的值必须是下面之一。
Point:点。
MultiPoint:多点。
LineString:线。
MultiLineString:多线。
Polygon:面。
MultiPolygon:多面。
GeometryCollection:几何体集合。
Feature:特征。
FeatureCollection:特征集合。
通常,GeoPandas缩写为gpd,用于将GeoJSON数据读入DataFrame。 下面你可以看到我们打印出了五行GeoJSON DataFrame:
{"type": "FeatureCollection","features": [/*表示地图上一个点*/{"type": "Feature","properties": {},"geometry": {"type": "Point","coordinates": [117.24609374999999,36.65079252503471]}},/*表示地图上一条线段*/{"type": "Feature","properties": {},"geometry": {"type": "LineString","coordinates": [[117.24599450826645,36.65120999361623],[117.24690914154054,36.65124657580678],[117.24694132804869,36.65100341150826],[117.24670529365538,36.650695689215624],[117.24620908498764,36.65059024562966]]}},/*表示地图上一个多边形(三角形,正方形,长方形....等等)*/{"type": "Feature","properties": {},"geometry": {"type": "Polygon","coordinates": [[[117.15253829956055,36.67089730689858],[117.14584350585938,36.658917692387114],[117.16318130493163,36.64721167063527],[117.17554092407227,36.65313376288551],[117.18034744262694,36.66773046368491],[117.17348098754883,36.677643625245274],[117.15322494506836,36.692786266889456],[117.13193893432617,36.68397636535661],[117.15047836303711,36.68012171607383],[117.15253829956055,36.67089730689858]]]}}]}
由以上格式可以发现,每一个对象都有一个成员变量 coordinates。如果 type 的值为 Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon 之一,则该对象必须有变量 coordinates。
如果 type 的值为 Feature(特征),那么此特征对象必须包含有变量 geometry,表示几何体,geometry 的值必须是几何体对象。此特征对象还包含有一个 properties,表示特性,properties 的值可以是任意 JSON 对象或 null。例如:
{
"type": "Feature",
"properties": {
"name": "北京"
},
"geometry": {
"type": "Point",
"coordinates": [ 116.3671875, 39.977120098439634]
}
如果 type 的值为 GeometryCollection(几何体集合),那么该对象必须有变量 geometries,其值是一个数组,数组的每一项都是一个 GeoJSON 的几何对象。如果 type 的值为 FeatureCollection(特征集合),则该对象必须有一个名称为 features 的成员。features 的值是一个数组,数组的每一项都是一个特征对象。
Geopandas操作Geojson
!pip3 install geopandas
!pip3 install geojsonio
# 定位到.geojson文件
import os
print(os.getcwd())
os.chdir("/content/drive/My Drive/Colab Notebooks")
os.chdir("/content/drive/My Drive/Colab Notebooks/EBOV/Data")
print(os.getcwd())
import geopandas as gpd
states = gpd.read_file('location_data_v3.geojson')
print(states.head())
print(states[0:])
print(states.shape)
绘制geojson地图
方法一: 软件
方法二:geopandas
关于我们将要使用的库,GeoPandas允许读取和处理地理空间数据,而Matplotlib可以绘制数据。GeoPandas依赖于与python-gdal包装器相同的基本原理,但是它不是读取地理空间图像并返回NumPy数组,而是返回Pandas Series和DataFrames,这通过提供对Pandas API函数的访问使处理这种类型的数据更加容易。
我们首先需要导入geopandas和matplotlib:
pip install pysal==1.13.0
import geopandas as gpd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (20, 10)# load our two GeoJSON files
df_places = gpd.read_file('places.geojson')
df_admin = gpd.read_file('admin.geojson')# 对于城市的边界多边形,无需任何处理即可直接绘制出来ax = df_admin.plot(color='green')# 请注意,我们保留了由图返回的变量的副本,因为我们打算在接下来的步骤中用城镇名称注释生成的多边形。
# 我们将遍历DataFrame位置中的所有条目,并绘制(ax.annotate(…))“ geometry”列设置的地理位
# 置处的城镇名称。为简单起见,我们将自己限制在人口超过10,000的城镇标签上:
for idx, row in df_places.iterrows():if row['population'] > 10000:coordinates = row['geometry'].coords.xyx, y = coordinates[0][0], coordinates[1][0]ax.annotate(row['name'], xy=(x, y), xytext=(x, y))# 我们通过在多边形上绘制城镇位置(下面用红色/白色小圆圈表示)。提供给plot()方法的参数值'OrRd'
# 是matplotlib 颜色图的名称,它基本上是从白色(较低值)到红色(较高值)的渐变。决定我们绘制点的
# 红色饱和度的列是填充列。给出最满意结果的choropleth分类方案是分位数方案。请注意,使用此方案需要
# PySAL(pip install pysal)df_places.plot(ax=ax, column='population', cmap='OrRd')