Возможно, немного поздно, но здесь другой метод, использующий теорему Жирара.В нем говорится, что площадь многоугольника больших кругов R ** в 2 раза больше суммы углов между многоугольниками минус (N-2) * pi, где N - число углов.
Я думал, что этоСтоит опубликовать, так как он не полагается ни на какие другие библиотеки, кроме numpy, и это совершенно другой метод, чем другие.Конечно, это работает только на сфере, поэтому при применении ее к Земле будет некоторая неточность.
Сначала я определю функцию для вычисления угла опоры от точки 1 по большому кругу к точке 2.:
import numpy as np
from numpy import cos, sin, arctan2
d2r = np.pi/180
def greatCircleBearing(lon1, lat1, lon2, lat2):
dLong = lon1 - lon2
s = cos(d2r*lat2)*sin(d2r*dLong)
c = cos(d2r*lat1)*sin(d2r*lat2) - sin(lat1*d2r)*cos(d2r*lat2)*cos(d2r*dLong)
return np.arctan2(s, c)
Теперь я могу использовать это, чтобы найти углы, а затем область (В дальнейшем, конечно, должны быть указаны lons и lats, и они должны быть в правильном порядке. Кроме того,радиус сферы должен быть указан.)
N = len(lons)
angles = np.empty(N)
for i in range(N):
phiB1, phiA, phiB2 = np.roll(lats, i)[:3]
LB1, LA, LB2 = np.roll(lons, i)[:3]
# calculate angle with north (eastward)
beta1 = greatCircleBearing(LA, phiA, LB1, phiB1)
beta2 = greatCircleBearing(LA, phiA, LB2, phiB2)
# calculate angle between the polygons and add to angle array
angles[i] = np.arccos(cos(-beta1)*cos(-beta2) + sin(-beta1)*sin(-beta2))
area = (sum(angles) - (N-2)*np.pi)*R**2
С координатами Колорадо, данными в другом ответе, и с радиусом Земли 6371 км, я получаю, что площадь составляет 268930758560.74808