原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
Cartopy基础入门
【Cartopy基础入门】Cartopy的安装
【Cartopy基础入门】如何丝滑的加载Geojson数据
文章目录
- Cartopy基础入门
- 一、Geojson数据来源
- 二、Cartopy加载geojson数据
- 1.geojson数据
- 2.常规图片:png、jpg
- 3.流文件格式的图
- 4.geodjango结合Cartopy
一、Geojson数据来源
空间的文本格式包括wkt、wkb、geojson等,geojson广泛存在前后端传输,文件读取,文本格式转换等。
我们系统是vue+leaflet做的前端,django作为后端,leaflet对于坐标的处理跟其他地图组件不同,其他框架都是经度在前,维度在后,leaflet是维度在前经度在后。leaflet支持geojson的加载。
二、Cartopy加载geojson数据
1.geojson数据
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.img_tiles as cimgt
from shapely.geometry import GeometryCollection, Point, asShape, shape
# 画布
proj = ccrs.PlateCarree()
plt.figure(figsize=[10, 6], dpi=300, edgecolor='coral')
geo_axes = plt.axes(projection=proj)
# 网格线
geo_axes.gridlines(draw_labels=True, x_inline=False, y_inline=False)
geom_json = json.loads(map_data['geom'].geojson)
print('geom_json ', geom_json )
geometries = shape(geom_json)
print('geometries', geometries)
2.常规图片:png、jpg
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.img_tiles as cimgt
from shapely.geometry import GeometryCollection, Point, asShape, shape
# 画布
proj = ccrs.PlateCarree()
plt.figure(figsize=[10, 6], dpi=300, edgecolor='coral')
geo_axes = plt.axes(projection=proj)
# 网格线
geo_axes.gridlines(draw_labels=True, x_inline=False, y_inline=False)
geom_json = json.loads(map_data['geom'].geojson)
print('geom_json ', geom_json )
geometries = shape(geom_json)
print('geometries', geometries)
geo_axes.add_geometries(geometries,
crs=ccrs.PlateCarree(),
# facecolor='k',
# edgecolor='k',
linestyle='--')
# png图
# plt.show()
plt.savefig('t1.png', dpi=300, bbox_inches='tight', transparent=True)
因为shapely版本问题,我这里是2.0版本,用上边的方法会有一个警告。
可以用以下代码替换
print('geometries', geometries)
print('geometries', geometries.geoms)
geo_axes.add_geometries(geometries.geoms,
crs=ccrs.PlateCarree(),
# facecolor='k',
# edgecolor='k',
linestyle='--')
3.流文件格式的图
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.img_tiles as cimgt
from shapely.geometry import GeometryCollection, Point, asShape, shape
# 画布
proj = ccrs.PlateCarree()
plt.figure(figsize=[10, 6], dpi=300, edgecolor='coral')
geo_axes = plt.axes(projection=proj)
# 网格线
geo_axes.gridlines(draw_labels=True, x_inline=False, y_inline=False)
geom_json = json.loads(map_data['geom'].geojson)
print('geom_json ', geom_json )
geometries = shape(geom_json)
print('geometries', geometries)
geo_axes.add_geometries(geometries,
crs=ccrs.PlateCarree(),
# facecolor='k',
# edgecolor='k',
linestyle='--')
# io流图像
img_buf = io.BytesIO()
plt.savefig(img_buf, dpi=300)
img_buf.seek(0)
4.geodjango结合Cartopy
map_data[‘geom’]是geodjango系统的GEOSGeometry格式数据,这个数据就是geodjango数据库的数据。GEOSGeometry的geojson和json方法提供的是str格式,shapely的shape方法接收的是geojson格式,所以我们需要json.loads。
print('geom', type(json.loads(map_data['geom'].geojson)))
geometries = shape(json.loads(map_data['geom'].geojson))