2015-06-21 4 views
7

Я хотел бы построить траекторию на базовой карте и обозначить ярлыки (имена) страны как наложения.Ярлыки стран на базовой карте

Вот текущий код и карта производит:

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() 

Это приводит к карте: Migration

Это отображение траектории мигрирующей птицы. Хотя это очень хорошая карта (!), Мне нужны ярлыки с названиями стран, поэтому легко определить страны, в которых летает птица.

Есть ли прямой способ добавления названий стран?

+2

Ничего себе, эта птица путешествует довольно далеко! Если вам нужны названия стран и координаты, посмотрите [этот вопрос] (http://stackoverflow.com/questions/2702309/need-a-list-of-all-countries-in-the-world-with-a -longitude-и-широта-coordin). Чтобы распечатать текст на карте, посмотрите на пример построения давления на [этой странице] (http://matplotlib.org/basemap/users/examples.html), кажется, что вы можете просто сделать 'plt.text (x, y, text) '. –

+0

Спасибо! Это было очень полезно. Я скоро опубликую полное решение ниже. –

ответ

6

Мое решение основано на внешнем файле данных, который может быть или не быть доступным в будущем. Однако аналогичные данные можно найти в другом месте, поэтому это не должно быть слишком большой проблемой.

Во-первых, код для печати: название страны этикетки:

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]) 

Все это делает для загрузки базы данных страны местонахождения от here, затем выберите страны, которые в настоящее время находятся на карте, и маркировать их ,

Полный код:

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() 

и, наконец, результат:

labeld-map

Очевидно, что это не так тщательно маркированы как можно было бы надеяться, и некоторые эвристики относительно размера страны, длина имени и размер карты должны быть реализованы, чтобы сделать это идеально, но это хорошая отправная точка.

Смежные вопросы