Konversikan shapefile dari koordinat yang diproyeksikan menggunakan Python


10

Pemula di sini berjuang dengan GIS. Saya mencoba memetakan bangsal untuk kota Milwuakee menggunakan shapefile yang ditemukan di situs web county situs web county mereka . Saya mengikuti utas di sini dengan beberapa keberhasilan. Kode saya memberi:

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)

dengan output,

-65.70220967836329 43.08590211722421

Masalahnya apakah ini salah. Lon / lat untuk Milwaukee adalah -87.863984 dan 42.920816.

Kedua, bagaimana saya bisa melakukan ini secara pemrograman untuk seluruh shapefile. Saya ingin merencanakan ini menjadi basemap. Ketika saya mencoba mengikuti utas ini saya mendapatkan kode kesalahan:

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)

kesalahan:

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

Jawaban:


10

Pada pertanyaan pertama, kode 'epsg: 32054' memiliki satuan kaki. Untuk alasan ini, perlu menggunakan 'preserve_units = True' sebagai parameter dalam inProj = Proj(init='epsg:32054')baris. Sekarang, kode selanjutnya berfungsi dengan baik:

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)

Pada pertanyaan kedua, ward.shp adalah shapefile poligon; bukan titik shapefile. Dalam hal ini, Anda dapat menggunakan modul geopanda untuk proyeksi ulang. Kode yang saya usulkan adalah (dengan jalur khusus saya):

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

Pada gambar berikutnya, Anda dapat melihat shapefile yang diproyeksikan kembali (wardWGS84.shp) dan titik (-87.9028568836077, 43.09691266312185) sebelum dipertimbangkan di Peta Kanvas QGIS:

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.