尝试使用 Cartopy 显示偏移量

问题描述 投票:0回答:0

我正在尝试使用 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()
python python-3.x matplotlib cartopy
© www.soinside.com 2019 - 2024. All rights reserved.