我正在尝试使用 OpenStreetMap tile server substrate 构建地图,该地图基于:控制点、剖面点 1 和 2 与不同颜色的线组合。对于每个轮廓点,方向(以度为单位的方位角)和箭头形式的偏移量(值)。
执行代码时,不显示箭头形式的方向(以度为单位的方位角)和偏移量(值)。对 scale_factor 值的更改不起作用。请告诉我,有什么问题吗?我找不到任何错误。提前感谢您的回复!
我有 3 个版本的代码,但它们都不起作用。
版本 1
import numpy as np
import matplotlib.pyplot as plt
from cartopy import crs as ccrs
import shapefile
from cartopy.io.img_tiles import OSM
from matplotlib.patches import FancyArrowPatch
shpfile = shapefile.Reader("/Users/Desktop/tdata/tdata")
fields = [x[0] for x in shpfile.fields[1:]]
points = {'base': [], 'profile1': [], 'profile2': []}
for item in shpfile.iterShapeRecords():
kind = item.record[fields.index('kind')]
position = item.shape.points[0]
points[kind].append((position, dict(zip(fields, item.record))))
tiles_provider = OSM()
plt.figure(figsize=(16, 16))
ax = plt.axes(projection=tiles_provider.crs)
ax.set_extent([shpfile.bbox[0]-0.1, shpfile.bbox[2]+0.1,
shpfile.bbox[1]-0.1, shpfile.bbox[3]+0.1], ccrs.PlateCarree())
ax.add_image(tiles_provider, 11)
def draw_arrow(ax, point, angle, length, scale_factor=1, **kwargs):
angle_rad = np.deg2rad(angle)
dx = scale_factor * length * np.cos(angle_rad)
dy = scale_factor * length * np.sin(angle_rad)
arrow = FancyArrowPatch(point, (point[0]+dx, point[1]+dy), connectionstyle="arc3,rad=.5", **kwargs)
ax.add_patch(arrow)
for point, data in points['base']:
ax.plot(point[0], point[1], marker='o', markersize=5, color='red', transform=ccrs.PlateCarree())
for i, (point, data) in enumerate(points['profile1']):
if i > 0:
prev_point = points['profile1'][i-1][0]
ax.plot([prev_point[0], point[0]], [prev_point[1], point[1]], color='blue', transform=ccrs.PlateCarree())
draw_arrow(ax, point, data['az'], data['value'], color='blue', scale_factor=0.001, transform=ccrs.PlateCarree())
for i, (point, data) in enumerate(points['profile2']):
if i > 0:
prev_point = points['profile2'][i-1][0]
ax.plot([prev_point[0], point[0]], [prev_point[1], point[1]], color='green', transform=ccrs.PlateCarree())
draw_arrow(ax, point, data['az'], data['value'], color='green', scale_factor=0.001, transform=ccrs.PlateCarree())
plt.show()
版本 2
import numpy as np
import matplotlib.pyplot as plt
from cartopy import crs as ccrs
import shapefile
from cartopy.io.img_tiles import OSM
from matplotlib.patches import FancyArrowPatch
shpfile = shapefile.Reader("/Users/Desktop/tdata/tdata")
fields = [x[0] for x in shpfile.fields[1:]]
points = {'base': [], 'profile1': [], 'profile2': []}
for item in shpfile.iterShapeRecords():
kind = item.record[fields.index('kind')]
position = item.shape.points[0]
points[kind].append((position, dict(zip(fields, item.record))))
tiles_provider = OSM()
plt.figure(figsize=(16, 16))
ax = plt.axes(projection=tiles_provider.crs)
ax.set_extent([shpfile.bbox[0]-0.1, shpfile.bbox[2]+0.1,
shpfile.bbox[1]-0.1, shpfile.bbox[3]+0.1], ccrs.PlateCarree())
ax.add_image(tiles_provider, 11)
def draw_arrow(ax, point, angle, length, scale_factor=1, **kwargs):
angle_rad = np.deg2rad(angle)
dx = scale_factor * length * np.cos(angle_rad)
dy = scale_factor * length * np.sin(angle_rad)
point_proj = ccrs.PlateCarree().transform_point(point[0], point[1], ax.projection)
arrow = FancyArrowPatch(point_proj, (point_proj[0] + dx, point_proj[1] + dy), connectionstyle="arc3,rad=.5", **kwargs)
ax.add_patch(arrow)
for point, data in points['base']:
ax.plot(point[0], point[1], marker='o', markersize=5, color='red', transform=ccrs.PlateCarree())
for i, (point, data) in enumerate(points['profile1']):
if i > 0:
prev_point = points['profile1'][i-1][0]
ax.plot([prev_point[0], point[0]], [prev_point[1], point[1]], color='blue', transform=ccrs.PlateCarree())
draw_arrow(ax, point, data['az'], data['value'], scale_factor=10, color='blue', transform=ax.projection)
for i, (point, data) in enumerate(points['profile2']):
if i > 0:
prev_point = points['profile2'][i-1][0]
ax.plot([prev_point[0], point[0]], [prev_point[1], point[1]], color='green', transform=ccrs.PlateCarree())
draw_arrow(ax, point, data['az'], data['value'], scale_factor=10, color='green', transform=ax.projection)
plt.show()
版本 3
import numpy as np
import matplotlib.pyplot as plt
from cartopy import crs as ccrs
import shapefile
from cartopy.io.img_tiles import OSM
from matplotlib.patches import FancyArrowPatch
from cartopy.mpl.geoaxes import GeoAxes
from matplotlib.transforms import offset_copy
shpfile = shapefile.Reader("/Users/Desktop/tdata/tdata")
fields = [x[0] for x in shpfile.fields[1:]]
points = {'base': [], 'profile1': [], 'profile2': []}
for item in shpfile.iterShapeRecords():
kind = item.record[fields.index('kind')]
position = item.shape.points[0]
points[kind].append((position, dict(zip(fields, item.record))))
tiles_provider = OSM()
plt.figure(figsize=(16, 16))
ax = plt.axes(projection=tiles_provider.crs)
ax.set_extent([shpfile.bbox[0]-0.1, shpfile.bbox[2]+0.1,
shpfile.bbox[1]-0.1, shpfile.bbox[3]+0.1], ccrs.PlateCarree())
ax.add_image(tiles_provider, 11)
def draw_arrow(ax, point, angle, length, color, scale_factor=1, linewidth=1.5, **kwargs):
angle_rad = np.deg2rad(angle)
dx = scale_factor * length * np.cos(angle_rad)
dy = scale_factor * length * np.sin(angle_rad)
proj_arrow = ccrs.PlateCarree().transform_point(point[0]+dx, point[1]+dy, ax.projection)
proj_point = ccrs.PlateCarree().transform_point(point[0], point[1], ax.projection)
arrow = FancyArrowPatch(proj_point, proj_arrow, arrowstyle='->', mutation_scale=20, linewidth=linewidth, color=color, **kwargs)
GeoAxes.add_patch(ax, arrow)
for point, data in points['base']:
ax.plot(point[0], point[1], marker='o', markersize=5, color='red', transform=ccrs.PlateCarree())
for i, (point, data) in enumerate(points['profile1']):
if i > 0:
prev_point = points['profile1'][i-1][0]
ax.plot([prev_point[0], point[0]], [prev_point[1], point[1]], color='blue', transform=ccrs.PlateCarree())
draw_arrow(ax, point, data['az'], data['value'], color='blue', scale_factor=0.001)
for i, (point, data) in enumerate(points['profile2']):
if i > 0:
prev_point = points['profile2'][i-1][0]
ax.plot([prev_point[0], point[0]], [prev_point[1], point[1]], color='green', transform=ccrs.PlateCarree())
draw_arrow(ax, point, data['az'], data['value'], color='green', scale_factor=0.001)
plt.show()