【Cartopy】如何丝滑的加载Geojson数据

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

Cartopy基础入门

【Cartopy】库的安装和瓦片加载(天地图、高德等)
【Cartopy】如何更好的确定边界显示
【Cartopy】如何丝滑的加载Geojson数据



一、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))
UE5是一种强大的游戏开发工具,能够加载并处理多种类型的数据。在加载GeoJSON数据时,可以通过使用蓝图来实现。 首先,我们需要创建一个蓝图类,用于加载和处理GeoJSON数据。在这个蓝图类中,我们可以添加一个事件节点,用于触发加载操作。接下来,我们可以使用File IO节点来读取GeoJSON文件,将其内容存储为字符串。 接下来,我们需要解析GeoJSON字符串并提取所需的数据。可以使用Json字符串解析器节点将字符串转换为Json对象,并使用Json对象节点来获取特定的属性值。根据GeoJSON的结构,我们可以使用Array和Object节点来访问不同层次的数据。 一旦我们提取了所需的数据,我们就可以在游戏中使用它们。例如,我们可以创建静态或动态的地理元素,并根据GeoJSON中的坐标信息来定位它们。我们还可以使用其他蓝图节点来实现各种不同的功能,例如在地图上渲染地理数据,或者根据GeoJSON数据动态生成游戏场景。 需要注意的是,加载和处理大型GeoJSON文件可能会导致性能问题。因此,在处理过程中,我们应该优化代码,并使用合适的算法和数据结构来提高效率。 总结而言,使用UE5的蓝图可以很方便地加载和处理GeoJSON数据。通过一系列蓝图节点的组合和调用,我们可以读取文件、解析字符串、提取数据,并在游戏中使用这些数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我辈李想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值