Хорошо, наконец-то я сделал это с помощью набора инструментов Basemap библиотеки matplotlib. Я объясню, как это работает, может быть, это кому-нибудь когда-нибудь пригодится.
1. Загрузите и установите библиотеку matplotlib в вашу систему. http://matplotlib.org/downloads.html
Для двоичных файлов Windows я рекомендую использовать эту страницу: http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib Остерегайтесь подсказки, в которой говорится:
Требуется numpy, dateutil, pytz, pyparsing, six и, возможно, подушка, pycairo, tornado, wxpython, pyside, pyqt, ghostscript, miktex, ffmpeg, mencoder, avconv или imagemagick.
Следовательно, если он еще не установлен в вашей системе, вам необходимо загрузить и установить numpy, dateutil, pytz, pyparsing и шесть, чтобы matplotlib работал правильно (для пользователей Windows: все они могут быть найдены на странице, для пользователей Linux , диспетчер пакетов python "pip" должен помочь).
2. Загрузите и установите набор инструментов "basemap" для matplotlib. Либо из http://matplotlib.org/basemap/users/installing.html, либо для двоичных файлов Windows также отсюда: http://www.lfd.uci.edu/~gohlke/pythonlibs/#basemap
3. Сделайте проекцию в своем коде Python:
#Import necessary libraries
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
#Coordinates that are to be transformed
long = -112.367
lat = 41.013
#Create a basemap for your projection. Which one you use is up to you.
#Some examples can be found at http://matplotlib.org/basemap/users/mapsetup.html
m = Basemap(projection='sinu',lon_0=0,resolution='c')
#Project the coordinates:
projected_coordinates = m(long,lat)
Выход:
projected_coordinates (10587117.191355567, 14567974.064658936)
Просто как тот. Теперь, когда вы используете спроецированные координаты для построения многоугольника с shapely, а затем вычисляете площадь с помощью метода shapely area, вы получаете площадь в квадратных метрах (в соответствии с используемой вами проекцией). Чтобы получить квадратные километры, разделите на 10 ^ 6.
Изменить: я изо всех сил пытался преобразовать не только отдельные координаты, но и целые геометрические объекты, такие как Многоугольники, когда они уже были заданы как фигурные объекты, а не через их исходные координаты. Это означало написание большого количества кода для
- получить координаты внешнего кольца многоугольника
- определить, есть ли в многоугольнике отверстия, и если да, обработать каждое отверстие отдельно
- преобразовать каждую пару координат внешнего кольца и любых отверстий
- соберите все вместе и создайте объект многоугольника с проецируемыми координатами
- и это только для полигонов ... добавьте еще больше петель для мультиполигонов и геометрических коллекций
Затем я наткнулся на эту часть красивой документации, которая значительно упрощает работу: http://toblerity.org/shapely/manual.html#shapely.ops.transform
Когда карта проекции настроена, например, как указано выше:
m = Basemap(width=1,height=1, resolution='l',projection='laea',lat_ts=50,lat_0=50,lon_0=-107.)
Затем, используя эту проекцию, можно преобразовать любой геометрический объект формы с помощью:
from shapely.ops import transform
projected_geometry = transform(m,geometry_object)
person
Dirk
schedule
19.05.2014