2012-11-15 3 views
15

Ciao Sto cercando di tracciare una mappa usando la mappa di base dei pitoni con alcuni paesi pieni di un certo colore.Fill countries in python basemap

C'è una soluzione rapida e facile là fuori ??

+2

forse utile: http: //www.geophysique. essere/2011/01/27/matplotlib-basemap-tutorial-07-shapefiles-unleached/ – unutbu

+0

Credo che questo aiuti: http://matplotlib.1069221.n5.nabble.com/How-to-draw-a-specific- country-by-basemap-td15744.html –

+2

Grazie per questi commenti, sono i più utili. Ho anche trovato un sito con dati nazionali gratuiti, che era proprio quello che stavo cercando: [http://www.naturalearthdata.com/](http://www.naturalearthdata.com/) –

risposta

12

Come è già stato detto da @unutbu, Thomas 'post here è esattamente quello che stai cercando.

Se volete fare questo con Cartopy, il codice corrispondente (in v0.7) può essere adattata da http://scitools.org.uk/cartopy/docs/latest/tutorials/using_the_shapereader.html leggermente:

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 
import cartopy.io.shapereader as shpreader 
import itertools 
import numpy as np 

shapename = 'admin_0_countries' 
countries_shp = shpreader.natural_earth(resolution='110m', 
             category='cultural', name=shapename) 

# some nice "earthy" colors 
earth_colors = np.array([(199, 233, 192), 
           (161, 217, 155), 
           (116, 196, 118), 
           (65, 171, 93), 
           (35, 139, 69), 
           ])/255. 
earth_colors = itertools.cycle(earth_colors) 



ax = plt.axes(projection=ccrs.PlateCarree()) 
for country in shpreader.Reader(countries_shp).records(): 
    print country.attributes['name_long'], earth_colors.next() 
    ax.add_geometries(country.geometry, ccrs.PlateCarree(), 
         facecolor=earth_colors.next(), 
         label=country.attributes['name_long']) 

plt.show() 

output

+3

Si prega di notare che è necessario inserire le parti essenziali della risposta qui, su questo sito, o il tuo post rischia di essere cancellato [Vedi le FAQ dove si parla di risposte che sono 'a mala pena più di un link'.] (Http: // StackOverflow .com/faq # eliminazione) È possibile includere il collegamento, se lo si desidera, ma solo come "riferimento". La risposta dovrebbe essere autonoma senza bisogno del collegamento. – Taryn

+1

Grazie a @bluefeet - Capisco perché sarebbe il caso. Ho aggiornato la risposta per fornire alcune nuove informazioni (senza duplicare il link originale, di cui non sono titolare il copyright). Cheers, – pelson

+0

Chiamare shpreader.natural_earth mi dà un errore http 404 non trovato, apparentemente cerca di scaricarlo? – Leo

9

Ispirato alla risposta da Pelson, I post la soluzione che ho. Lascerò a te ciò che funziona meglio, quindi non accetterò alcuna risposta al momento.

#! /usr/bin/env python 

import sys 
import os 
from pylab import * 
from mpl_toolkits.basemap import Basemap 
import matplotlib as mp 

from shapelib import ShapeFile 
import dbflib 
from matplotlib.collections import LineCollection 
from matplotlib import cm 

def get_shapeData(shp,dbf): 
    for npoly in range(shp.info()[0]): 
    shpsegs = [] 
    shpinfo = [] 

    shp_object = shp.read_object(npoly) 
    verts = shp_object.vertices() 
    rings = len(verts) 
    for ring in range(rings): 
     if ring == 0: 
      shapedict = dbf.read_record(npoly) 
     name = shapedict["name_long"] 
     continent = shapedict["continent"] 
     lons, lats = zip(*verts[ring]) 
     if max(lons) > 721. or min(lons) < -721. or max(lats) > 91. or min(lats) < -91: 
      raise ValueError,msg 
     x, y = m(lons, lats) 
     shpsegs.append(zip(x,y)) 
     shapedict['RINGNUM'] = ring+1 
     shapedict['SHAPENUM'] = npoly+1 
     shpinfo.append(shapedict) 

    lines = LineCollection(shpsegs,antialiaseds=(1,)) 
    lines.set_facecolors(cm.jet(np.random.rand(1))) 
    lines.set_edgecolors('k') 
    lines.set_linewidth(0.3) 
    ax.add_collection(lines) 


if __name__=='__main__': 

    f=figure(figsize=(10,10)) 
    ax = plt.subplot(111) 
    m = Basemap(projection='merc',llcrnrlat=30,urcrnrlat=72,\ 
      llcrnrlon=-40,urcrnrlon=50,resolution='c') 
    m.drawcountries(linewidth=0.1,color='w') 

    sfile = 'ne_10m_admin_0_countries' 

    shp = ShapeFile(sfile) 
    dbf = dbflib.open(sfile) 
    get_shapeData(shp,dbf) 

    show() 
    sys.exit(0) 

Questo è il risultato

example for filling in countries in different colours

Ecco il mio esempio come riempire in Albania nel colore corretto (non molto elegante lo so;)).

#HACK for Albania 
    shpsegs = [] 
    shpinfo = [] 

    shp_object = shp.read_object(9) 
    verts = shp_object.vertices() 
    rings = len(verts) 
    for ring in range(rings): 
     if ring == 0: 
      shapedict = dbf.read_record(9) 
     name = shapedict["name_long"] 
     continent = shapedict["continent"] 
     lons, lats = zip(*verts[ring]) 
     if max(lons) > 721. or min(lons) < -721. or max(lats) > 91. or min(lats) < -91: 
      raise ValueError,msg 
     x, y = m(lons, lats) 
     shpsegs.append(zip(x,y)) 
     shapedict['RINGNUM'] = ring+1 
     shapedict['SHAPENUM'] = npoly+1 
     shpinfo.append(shapedict) 
    lines = LineCollection(shpsegs,antialiaseds=(1,)) 
    if name == 'Albania': 
    lines.set_facecolors('w') 
    lines.set_edgecolors('k') 
    lines.set_linewidth(0.3) 
    ax.add_collection(lines) 

È importante eseguire questa operazione dopo aver eseguito tutte le altre forme. Forse puoi sbarazzarti di una parte di questo codice, ma come ho detto è stato sufficiente per me.

per la mia applicazione I Contries colorati in base al nome o continente, quindi queste righe:

name = shapedict["name_long"] 
    continent = shapedict["continent"] 

I dati utilizzati che ho ricevuto da questo sito: http://www.naturalearthdata.com/

+2

La tua Albania è affondata. Non che molti se ne accorgano: D – theta

+0

Sì, effettivamente lo stesso succede in Armenia. Ho dovuto lavorare a un lavoro, riempiendo esplicitamente questi due paesi in seguito.L'inquisizione con le persone di naturalearthdata non è stata decisiva e non l'ho seguito una volta che l'ho risolto per me –

+0

@red_tiger Ho lo stesso problema con l'Argentina e l'Angola. Puoi pubblicare la tua soluzione al "problema albanese"? Che cosa hanno detto le persone di NaturalEarth? Grazie. –