pyproj를 사용하여 EPSG : 4326 경도 좌표를 xy로 변환

Aug 19 2020

pyproj를 사용하여 USGS Earthquake 피드 의 위도 좌표를 베이스 맵의 해당 위치에 해당하는 xy 좌표 로 변환하는 세부 사항을 알아 내려고합니다 . 지금까지 내 코드는 PIL / 베개를 사용하여베이스 맵의 EPSG : 4326 투영을 고려하지 않고 경도를 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 좌표를 출력하는 투영 함수입니다. 나는 이것을 직접 작성할 것이지만 그 변환에 적합한 방정식을 찾을 수 없으며 proj 에서이 기능을 찾고 싶었습니다.

업데이트 여기에 내가 사용하고있는베이스 맵이 있습니다.

그리고 여기에 결과 그림이 있습니다. 나는 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에서 지진을 확인했고, 포인트가 모두 올바른 위치에 있습니다!