Menerjemahkan EPSG: 4326 lon lintang koordinat ke xy menggunakan pyproj

Aug 19 2020

Saya mencoba untuk mengetahui detail penggunaan pyproj untuk menerjemahkan koordinat lat lon dari umpan Gempa USGS ke koordinat xy yang sesuai dengan posisi tersebut di peta dasar dengan lebar dan tinggi yang ditentukan serta asal di kiri atas. Kode saya sejauh ini secara naif menggunakan PIL / bantal untuk menerjemahkan lon lat ke posisi xy dan menggambar lingkaran tanpa memperhitungkan proyeksi EPSG: 4326 dari peta dasar:

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)

Saya telah membaca dokumentasi dan memiliki pengertian umum bahwa saya akan menggunakan sesuatu seperti:

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

dengan beberapa dimensi lebar dan tinggi. Menjalankan baris di atas memberikan kesalahan:

TypeError: p1 must be a Proj class

Perbarui Saya mendapatkan nilai untuk:

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

Dalam hal ini masukan (lon, lat) (-110, 39)memberikan keluaran 1.923, 0.688yang tidak benar. Yang saya butuhkan adalah fungsi proyeksi yang mengambil lon, lintang dan lebar dan tinggi gambar dan mengeluarkan koordinat x, y. Saya akan menulis ini sendiri, tetapi saya tidak dapat menemukan persamaan yang cocok untuk konversi itu dan berharap menemukan kemampuan ini dalam proyek.

UPDATE Berikut adalah peta dasar yang saya gunakan.

Dan inilah gambar yang dihasilkan. Saya berasumsi bahwa titik pusat untuk lingkaran yang menandai gempa bumi tidak aktif, karena saya menggunakan koordinat Kartesius untuk lon, lat, tetapi peta dasar dibuat dengan proyeksi dan karenanya harus memiliki distorsi dari koordinat Cartesian x, y.

Juga, saya sadar saya perlu meletakkan legenda saya pada skala logaritmik. Belum sampai ke situ.

Jawaban

5 FSimardGIS Aug 22 2020 at 04:12

Ketika saya melapisi peta dasar Anda pada proyeksi Equirectangular, itu sangat cocok. Jadi ini berarti peta dasar Anda benar-benar hanya menggunakan "proyeksi" sederhana untuk menggambarkan garis bujur sebagai x dan garis lintang sebagai y. Yang berarti satu-satunya hal yang perlu Anda khawatirkan adalah memeriksa ukuran gambar, yang sudah Anda lakukan di rumus Anda.

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

Ini akan berfungsi dengan baik untuk kebutuhan Anda, ke piksel terdekat. Faktanya, saya memverifikasi Gempa Bumi di USGS pada tanggal itu, dan semua poin Anda ada di lokasi yang benar!