pyprojを使用してEPSG:4326 lonlat座標をxyに変換する

Aug 19 2020

pyprojを使用して、USGS地震フィードからの緯度経度座標を、左上の決定された幅と高さおよび原点のベースマップ上のそれらの位置に対応するxy座標に変換する方法の詳細を調べようとしています。これまでの私のコードでは、ベースマップのEPSG:4326投影を考慮せずに、PIL /枕を使用してlon latをxy位置に変換し、円を描画しています。

from PIL import Image
from PIL import ImageDraw

# open basemap image file
basemap = Image.open(basemap_path).convert('RGBA)

# resize to desired map size
basemap.thumbnail(width, height, Image.LANCZOS)

# get proportional height
width_bmp, height_bmp = basemap.size

# create background frame and paste basemap on it
img=Image.new('RGB',(width, height), color = '#000000')
img.paste(basemap, (0,0), basemap)
draw = ImageDraw.Draw(img, 'RGBA')

width_scale = width/360
height_scale = height_bmp/180

# usgs data has been parsed into a list
for quake in earthquake_list:
    lon = float(quake["longitude"])
    lat = float(quake["latitude"])
    mag = float(quake["mag"])

    # want to use pyproj to translate coordinates here instead of the following
    cx = (lon + 180) * width_scale
    cy = (90-lat) * height_scale
    r  = scaleRadius(mag)

    # draw earthquake circles
    draw.ellipse((cx-r, cy-r, cx+r, cy+r), fill = colormap(mag))

draw = ImageDraw.Draw(img)
img.save(filepath, quality=100)

私はドキュメントを読み、次のようなものを使用するという一般的な感覚を持っています。

cx, cy = pyproj.transform("EPSG:4326", "xy", lon, lat)

いくつかの幅と高さの寸法があります。上記の行を実行すると、エラーが発生します。

TypeError: p1 must be a Proj class

更新私は次の値を取得します:

p = Proj(proj = 'longlat', ellps='WGS84')
cx,cy = p(lon, lat)

この場合、(lon、lat)入力は正しくない(-110, 39)出力1.923, 0.688を提供します。必要なのは、画像のlon、lat、幅と高さを取得し、x、y座標を出力する投影関数です。私はこれを自分で書きますが、その変換に適した方程式を見つけることができず、プロジェクトでこの機能を見つけることを望んでいました。

更新これが私が使用しているベースマップです。

そして、これが結果の図面です。lon、latにデカルト座標を使用しているため、地震を示す円の中心点がずれていると想定していますが、ベースマップは投影で作成されているため、x、yデカルト座標からの歪みが必要です。

また、自分の凡例を対数目盛で表す必要があることも理解しています。まだそれに到達していません。

回答

5 FSimardGIS Aug 22 2020 at 04:12

ベースマップを正距円筒図法にオーバーレイすると、完全にフィットします。つまり、ベースマップは実際には、経度をxとして、緯度をyとしてプロットするという単純な「投影」を使用しているだけです。つまり、心配する必要があるのは、数式ですでに行っている画像のサイズを確認することだけです。

cx = (lon + 180) * width_scale
cy = (90-lat) * height_scale

これらは、最も近いピクセルまで、ニーズに合わせて適切に機能します。実際、私はその日にUSGSで地震を確認しました、そしてあなたのポイントはすべて正しい場所にあります!