Python 基础地图上的国家标签

Python 基础地图上的国家标签,python,matplotlib,gis,matplotlib-basemap,Python,Matplotlib,Gis,Matplotlib Basemap,我想在底图上绘制一条轨迹,并将国家标签(名称)显示为覆盖图 以下是当前代码及其生成的映射: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap path = "path\\to\\data" animal_data = pd.DataFrame.from_csv(path, header=None) animal_data.columns = ["dat

我想在底图上绘制一条轨迹,并将国家标签(名称)显示为覆盖图

以下是当前代码及其生成的映射:

import pandas as pd 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap


path = "path\\to\\data"

animal_data = pd.DataFrame.from_csv(path, header=None)
animal_data.columns = ["date", "time", "gps_lat", "gps_long"]

# data cleaning omitted for clarity 

params = {
        'projection':'merc', 
        'lat_0':animal_data.gps_lat.mean(), 
        'lon_0':animal_data.gps_long.mean(), 
        'resolution':'h', 
        'area_thresh':0.1, 
        'llcrnrlon':animal_data.gps_long.min()-10, 
        'llcrnrlat':animal_data.gps_lat.min()-10, 
        'urcrnrlon':animal_data.gps_long.max()+10, 
        'urcrnrlat':animal_data.gps_lat.max()+10
}
map = Basemap(**params)

map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()          

x, y = map(animal_data.gps_long.values, animal_data.gps_lat.values)

map.plot(x, y, 'b-', linewidth=1)    
plt.show()
这将在地图中显示:

这是一张迁徙鸟类的轨迹图。虽然这是一张非常漂亮的地图(!),但我需要国家名称标签,这样就可以很容易地确定鸟要飞到的国家


有没有直接添加国家名称的方法?

我的解决方案依赖于一个外部数据文件,该文件将来可能可用,也可能不可用。然而,其他地方也可以找到类似的数据,因此这不应该是一个太大的问题

首先,打印国家名称标签的代码:

import pandas as pd 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap

class MyBasemap(Basemap):     
    def printcountries(self, d=3, max_len=12):
        data = pd.io.parsers.read_csv("http://opengeocode.org/cude/download.php?file=/home/fashions/public_html/opengeocode.org/download/cow.txt", 
                                      sep=";", skiprows=28 )
        data = data[(data.latitude > self.llcrnrlat+d) & (data.latitude < self.urcrnrlat-d) & (data.longitude > self.llcrnrlon+d) & (data.longitude < self.urcrnrlon-d)]
        for ix, country in data.iterrows():                            
                plt.text(*self(country.longitude, country.latitude), s=country.BGN_name[:max_len]) 
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
从mpl_toolkits.basemap导入basemap
类MyBasemap(Basemap):
def打印国家(自身,d=3,最大长度=12):
data=pd.io.parsers.read\u csv(“http://opengeocode.org/cude/download.php?file=/home/fashions/public_html/opengeocode.org/download/cow.txt", 
sep=“;”,skiprows=28)
数据=数据[(data.latitude>self.llcrnrlat+d)和(data.latitudeself.llcrnrlon+d)和(data.longitude
所做的一切就是从下载一个国家位置数据库,然后选择当前在地图上的国家,并标记它们

完整代码:

import pandas as pd 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap

class MyBasemap(Basemap):     
    def printcountries(self, d=3, max_len=12):
        data = pd.io.parsers.read_csv("http://opengeocode.org/cude/download.php?file=/home/fashions/public_html/opengeocode.org/download/cow.txt", 
                                      sep=";", skiprows=28 )
        data = data[(data.latitude > self.llcrnrlat+d) & (data.latitude < self.urcrnrlat-d) & (data.longitude > self.llcrnrlon+d) & (data.longitude < self.urcrnrlon-d)]
        for ix, country in data.iterrows():                            
                plt.text(*self(country.longitude, country.latitude), s=country.BGN_name[:max_len]) 


path = "path\\to\\data"

animal_data = pd.DataFrame.from_csv(path, header=None)
animal_data.columns = ["date", "time", "gps_lat", "gps_long"]

params = {
        'projection':'merc', 
        'lat_0':animal_data.gps_lat.mean(), 
        'lon_0':animal_data.gps_long.mean(), 
        'resolution':'h', 
        'area_thresh':0.1, 
        'llcrnrlon':animal_data.gps_long.min()-10, 
        'llcrnrlat':animal_data.gps_lat.min()-10, 
        'urcrnrlon':animal_data.gps_long.max()+10, 
        'urcrnrlat':animal_data.gps_lat.max()+10
}

plt.figure()
map = MyBasemap(**params)

map.drawcoastlines()
map.fillcontinents(color = 'coral')
map.drawmapboundary()          
map.drawcountries()
map.printcountries()

x, y = map(animal_data.gps_long.values, animal_data.gps_lat.values)

map.plot(x, y, 'b-', linewidth=1)    
plt.show()
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
从mpl_toolkits.basemap导入basemap
类MyBasemap(Basemap):
def打印国家(自身,d=3,最大长度=12):
data=pd.io.parsers.read\u csv(“http://opengeocode.org/cude/download.php?file=/home/fashions/public_html/opengeocode.org/download/cow.txt", 
sep=“;”,skiprows=28)
数据=数据[(data.latitude>self.llcrnrlat+d)和(data.latitudeself.llcrnrlon+d)和(data.longitude
最后,结果是:


显然,这并不像人们希望的那样仔细标注,应该实施一些关于国家大小、名称长度和地图大小的启发式方法,以使其完美,但这是一个很好的起点

哇,那只鸟飞了好远!如果您需要国家名称和坐标,请查看。要在地图上打印文本,请看一看打印压力的示例,似乎您可以只执行
plt.text(x,y,text)
。谢谢!这很有帮助。我将很快在下面发布完整的解决方案。