#python #cartopy
#python #картография
Вопрос:
При построении ортографической проекции с некоторыми точками на другой стороне земного шара, почему первый подход строится так, как ожидалось, но второй берет все точки, которые будут находиться на другой стороне земного шара, и строит их на полюсе проекции? Есть ли решение помимо фильтрации точек, которые находятся вне поля зрения, и если нет, то каков наилучший способ сделать это для полюса на произвольном lon / lat (в отличие от северного полюса, который относительно тривиален)?
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
projection = ccrs.Orthographic(0, 90)
transform = ccrs.Geodetic()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection = projection)
ax.coastlines()
ax.set_global()
ax.gridlines()
npoints = 100
np.random.seed(71077345)
lon = np.random.sample(npoints) * 360
lat = np.random.sample(npoints) * 180 - 90
plt.plot(lon,
lat,
'ro',
alpha = 0.3,
transform = transform)
for i in range(npoints):
plt.plot(lon[i],
lat[i],
'b.',
alpha = 0.3,
transform = transform)
Комментарии:
1. Одним из возможных решений проблемы для произвольного полюса является обработка полюса как vector (
x=cos(lat)cos(lon);y=cos(lat)sin(lon);z=sin(lat)
), а затем выполнение того же самого для каждой точки для построения графика. Если скалярное произведение двух точек равно> = 0, то оно находится в полушарии; в противном случае это не так. Тем не менее, мне интересно, есть ли способ сделать это в пакете.2. Я подозреваю, что это ошибка. Точки ниже экватора (широта <0) не должны отображаться во всех случаях.
Ответ №1:
(Частичный ответ на вопрос)
Чтобы отфильтровать точки на верхней полусфере, используйте этот код
for i in range(npoints):
if lat[i]>=0:
# this plots points above/on equator
ccode = 'b^'
ax.plot( lon[i], lat[i],
ccode,
alpha = .3,
transform = ccrs.PlateCarree()
)
else:
# this skips points below equator
pass
Комментарии:
1. Это будет работать, когда полюсом проекции является северный полюс, но не тогда, когда полюс равен, например, 25 N 135 E. Вот почему я предложил в своем комментарии к первоначальному вопросу использовать тест точечного произведения.
Ответ №2:
Эта ошибка была исправлена в версии 0.19 и более поздних версиях # 1710.