Преобразование шейп-файла из проецируемых координат с использованием Python

10

Новичок здесь борется с ГИС. Я пытаюсь наметить приходы для города Милуаки, используя шейп-файлы, найденные на их веб-сайте округа . Я следую за темой здесь с некоторым успехом. Мой код дает:

from pyproj import Proj, transform
# wisconsing EPSG:32054
# epsg:4326 is for the entire world, wgs 84...not obvious
inProj = Proj(init='epsg:32054')
outProj = Proj(init='epsg:4326')
x1,y1 = 2560131.496875003, 406816.434375003
x2,y2 = transform(inProj,outProj,x1,y1)
print(x2,y2)

с выходом,

-65.70220967836329 43.08590211722421

Проблема в том, что это неправильно. Lon / lat для Милуоки -87,863984 и 42,920816.

Во-вторых, как я могу сделать это программно для всего шейп-файла. Я хотел бы представить это в базовой карте. Когда я пытаюсь следовать этой теме, я получаю код ошибки:

with fiona.open("ward2012/ward.shp") as shp:
    ori = Proj(init='epsg:32054' ),
    dest= Proj(init='EPSG:4326',preserve_units=True)
    with fiona.open('ward2012/MKE_wards_lat_lon.shp', 'w', 'ESRI Shapefile', shp.schema.copy(), crs=from_epsg(4326))as output:
        for point in shp:
            x,y =  point['geometry']['coordinates']
            point['geometry']['coordinates'] = transform(ori, dest,x,y)
            output.write(point)

ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-139-a5079ab39f99> in <module>()
      4     with fiona.open('ward2012/MKE_wards_lat_lon.shp', 'w', 'ESRI Shapefile', shp.schema.copy(), crs=from_epsg(4326))as output:
      5         for point in shp:
----> 6             x,y =  point['geometry']['coordinates']
      7             point['geometry']['coordinates'] = transform(ori, dest,x,y)
      8             output.write(point)

ValueError: not enough values to unpack (expected 2, got 1)
супергероя
источник

Ответы:

10

На первый вопрос, код «epsg: 32054» имеет единицы измерения футов. По этой причине в качестве параметра в inProj = Proj(init='epsg:32054')строке необходимо использовать «preserve_units = True» . Теперь следующий код работает хорошо:

from pyproj import Proj, transform
# wisconsing EPSG:32054
# epsg:4326 is for the entire world, wgs 84...not obvious
inProj = Proj(init='epsg:32054', preserve_units=True)
outProj = Proj(init='epsg:4326')
x1,y1 = 2560131.496875003, 406816.434375003
x2,y2 = transform(inProj,outProj,x1,y1)
print (x2,y2)
(-87.9028568836077, 43.09691266312185)

Во втором вопросе ward.shp - это многоугольный шейп- файл ; не точный файл формы. В этом случае вы можете использовать модуль геопанды для перепроецирования. Мой предложенный код (с моим конкретным путем):

import geopandas as gpd

tmp = gpd.GeoDataFrame.from_file('/home/zeito/pyqgis_data/ward2012/ward.shp')

tmpWGS84 = tmp.to_crs({'proj':'longlat', 'ellps':'WGS84', 'datum':'WGS84'})

tmpWGS84.to_file('/home/zeito/pyqgis_data/ward2012/wardWGS84.shp')

На следующем изображении вы можете увидеть перепроецированный шейп-файл (wardWGS84.shp) и точку (-87.9028568836077, 43.09691266312185), прежде чем рассматривать их на холсте карты QGIS:

введите описание изображения здесь

xunilk
источник