การแปล EPSG: พิกัด lon lat 4326 เป็น xy โดยใช้ pyproj

Aug 19 2020

ฉันกำลังพยายามหารายละเอียดของการใช้ pyproj เพื่อแปลพิกัด lat lon จากฟีดแผ่นดินไหวของ USGSเป็นพิกัด xy ที่ตรงกับตำแหน่งเหล่านั้นบนแผนที่ฐานของความกว้างและความสูงที่กำหนดและจุดเริ่มต้นที่ด้านซ้ายบน รหัสของฉันใช้ PIL / pillow อย่างไร้เดียงสาในการแปล lon lat เป็นตำแหน่ง xy และวาดวงกลมโดยไม่คำนึงถึงการฉายภาพ EPSG: 4326 ของแผนที่ฐาน:

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ที่ไม่ถูกต้อง สิ่งที่ฉันต้องการคือฟังก์ชั่นการฉายภาพที่ใช้ความยาว lat และความกว้างและความสูงของภาพและส่งออกพิกัด x, y ฉันจะเขียนสิ่งนี้ด้วยตัวเอง แต่ฉันไม่พบสมการที่เหมาะสมสำหรับการแปลงนั้นและหวังว่าจะพบความสามารถนี้ใน proj

อัปเดตนี่คือแผนที่ฐานที่ฉันใช้

และนี่คือภาพวาดที่ได้ ฉันสมมติว่าจุดศูนย์กลางของวงกลมที่ทำเครื่องหมายแผ่นดินไหวปิดอยู่เพราะฉันใช้พิกัดคาร์ทีเซียนสำหรับ lon, lat แต่แผนที่ฐานถูกสร้างขึ้นด้วยการฉายภาพดังนั้นจึงต้องมีการบิดเบือนจากพิกัด x, y คาร์ทีเซียน

นอกจากนี้ฉันตระหนักดีว่าฉันต้องวางตำนานของฉันไว้ในมาตราส่วนลอการิทึม ยังไม่ได้ไปถึงที่

คำตอบ

5 FSimardGIS Aug 22 2020 at 04:12

เมื่อฉันวางซ้อนแผนที่ฐานของคุณบนการฉายภาพแบบ Equirectangular มันจะลงตัวที่สุด ดังนั้นนี่หมายความว่าแผนที่ฐานของคุณใช้ "เส้นโครง" อย่างง่ายในการพล็อตลองจิจูดเป็น x และละติจูดเป็น y ซึ่งหมายความว่าสิ่งเดียวที่คุณต้องกังวลคือการตรวจสอบขนาดของรูปภาพซึ่งคุณได้ทำไปแล้วในสูตรของคุณ

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

สิ่งเหล่านี้จะทำงานได้ตามความต้องการของคุณไปยังพิกเซลที่ใกล้ที่สุด อันที่จริงฉันได้ตรวจสอบแผ่นดินไหวบน USGS ในวันนั้นและคะแนนของคุณทั้งหมดอยู่ในตำแหน่งที่ถูกต้อง!