Pythonを使用して投影座標からシェープファイルを変換する


10

初心者はここでGISと格闘しています。私は、郡のウェブサイトの郡のウェブサイトにあるシェープファイルを使用して、ミルウォーキー市の病棟を作成しようとしています。私はいくつかの成功を収めてここのスレッドをフォローしています。私のコードは与えます:

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

問題はこれが間違っていることです。ミルウォーキーの経度/緯度は-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」コードにはフィート単位があります。このため、 'preserve_units = True'をパラメーターとして使用する必要がありますinProj = Proj(init='epsg:32054')。今、次のコードはうまくいきます:

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)

2番目の質問では、ward.shpはポリゴンシェープファイルです。ポイントシェープファイルではありません。この場合、再投影にgeopandasモジュールを使用できます。私の提案されたコードは(私の特定のパスで)です:

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

次の画像では、QGISのMap Canvasで考慮される前の再投影されたシェープファイル(wardWGS84.shp)とポイント(-87.9028568836077、43.09691266312185)を確認できます。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.