Converta shapefile de coordenadas projetadas usando Python

10

Novato aqui lutando com SIG. Estou tentando mapear as alas da cidade de Milwuakee usando os shapefiles encontrados no site do condado . Estou seguindo o tópico aqui com algum sucesso. Meu código é dá:

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)

com saída,

-65.70220967836329 43.08590211722421

O problema é que isso está errado. O lon / lat para Milwaukee é -87,863984 e 42,920816.

Em segundo lugar, como posso fazer isso programaticamente para todo o shapefile. Eu gostaria de plotar isso no mapa base. Quando tento seguir este tópico, recebo um código de erro:

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)

erro:

---------------------------------------------------------------------------
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)
Super heroi
fonte

Respostas:

10

Na primeira pergunta, o código 'epsg: 32054' possui unidades de pés. Por esse motivo, é necessário usar 'preserve_units = True' como parâmetro na inProj = Proj(init='epsg:32054')linha. Agora, o próximo código funciona bem:

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)

Na segunda pergunta, ward.shp é um arquivo de forma de polígono; não é um shapefile de ponto. Nesse caso, você pode usar o módulo geopandas para reprojeção. Meu código proposto é (com meu caminho específico):

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')

Na próxima imagem, você pode ver o shapefile reprojetado (wardWGS84.shp) e o ponto (-87.9028568836077, 43.09691266312185) antes considerado no Map Canvas do QGIS:

insira a descrição da imagem aqui

xunilk
fonte