Картография, отображающая дополнительные точки на полюсах при передаче по одному за раз

#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.