You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python地图坐标绘制问题:坐标不匹配且地图图像翻转

解决地图与经纬度坐标对齐的问题

嘿,我来帮你搞定这个坐标对齐的麻烦!你的问题主要出在坐标顺序搞反图像原点设置不对,还有一些代码冗余上,咱们一步步来修正:

问题根源分析

  • 坐标x/y弄混了:你把纬度(列表第2个元素)当成了x轴,经度(第3个元素)当成了y轴,但地理坐标系里,经度是x轴(东西方向),纬度是y轴(南北方向),这直接导致点的位置完全错位。
  • 重复调用imshow:你的代码里连续两次调用plt.imshow,第二次会覆盖第一次的绘图设置,相当于白做了第一次的操作。
  • 图像原点不匹配:Matplotlib的imshow默认原点在图像左上角,但地理坐标的纬度(南纬为负)是越往南越“小”(更负),所以直接设置extent会导致地图上下翻转,需要指定origin='lower'让原点对齐地理坐标的底部。
  • extent时坐标系统不匹配:没设置extent的话,imshow用的是像素坐标(0到图像宽/高),而你的经纬度是地理数值,两者范围完全不同,所以点会聚集在角落。

修正后的完整代码

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def mapping_data(atlas_data):
    # 修正坐标:x是经度(第3个元素),y是纬度(第2个元素)
    x = [item[2] for item in atlas_data]
    y = [item[1] for item in atlas_data]
    
    # 读取地图图片,只调用一次imshow,设置extent和origin
    map_img = mpimg.imread('map.png')
    # extent参数顺序:(左经度, 右经度, 下纬度, 上纬度),origin='lower'对齐地理坐标
    plt.imshow(map_img, extent=(149.105, 149.130, -35.29, -35.27), origin='lower')
    
    # 绘制散点,可自定义颜色和大小让点更明显
    plt.scatter(x, y, color='red', s=15)
    plt.xlabel('Longitude')
    plt.ylabel('Latitude')
    plt.title('Bird Observations on Map')
    plt.show()

# 你的参考数据示例
sample_data = [['Kookaburra', -35.27667, 149.1097, 'Australian National Botaniacl Gardens, Canberra', '2000-08-14', 'Aves', 'Coraciiformes', 'Alcedinidae', 'Dacelo', 'Dacelo novaeguineae', 'False'], ['White-faced heron', -35.272244105599064, 149.12580246473127, 'Sullivans Creek--Turner Parkland', '2016-08-09', 'Aves', 'Ciconiiformes', 'Ardeidae', 'Egretta', 'Egretta novaehollandiae', 'False'], ['Australian King-parrot', -35.274386, 149.112636, 'CSIRO (Black Mountain)', '2014-10-20', 'Aves', 'Psittaciformes', 'Psittacidae', 'Alisterus', 'Alisterus scapularis', 'False'], ['Eastern Spinebill', -35.27719917903922, 149.10937031732462, 'Australian National Botanic Gardens', '2000-09-08', 'Aves', 'Passeriformes', 'Meliphagidae', 'Acanthorhynchus', 'Acanthorhynchus tenuirostris', 'False'], ['Crimson Rosella', -35.2780499, 149.11015749999999, 'Australian National Botanic Gardens', '2003-08-08', 'Aves', 'Psittaciformes', 'Psittacidae', 'Platycercus', 'Platycercus elegans', 'False'], ['Australian Raven', -35.27856893080605, 149.10974594347084, 'Australian National Botanic Gardens', '2018-03-18', 'Aves', 'Passeriformes', 'Corvidae', 'Corvus', 'Corvus coronoides', 'False'], ['Australian King-parrot', -35.2780499, 149.11015749999999, 'Australian National Botanic Gardens', '2012-07-24', 'Aves', 'Psittaciformes', 'Psittacidae', 'Alisterus', 'Alisterus scapularis', 'False']]

# 调用函数
mapping_data(sample_data)

关键改动说明

  • 修正坐标顺序:把x换成经度(item[2]),y换成纬度(item[1]),这是最核心的错误修正。
  • 移除重复的imshow:只读取一次地图图片,并在imshow中一次性设置extentorigin参数,避免绘图覆盖。
  • 添加origin='lower':让图像的底部对应地理坐标的南(更小的纬度值),顶部对应北(更大的纬度值),彻底解决地图翻转问题。
  • 优化循环逻辑:用列表推导式替代while循环,代码更简洁易读。

这样修改后,你的散点应该就能准确对应到地图上的位置啦!

内容的提问来源于stack exchange,提问作者spacejunkee

火山引擎 最新活动