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 ??
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 ??
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()
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
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
Chiamare shpreader.natural_earth mi dà un errore http 404 non trovato, apparentemente cerca di scaricarlo? – Leo
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
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/
La tua Albania è affondata. Non che molti se ne accorgano: D – theta
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 –
@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. –
forse utile: http: //www.geophysique. essere/2011/01/27/matplotlib-basemap-tutorial-07-shapefiles-unleached/ – unutbu
Credo che questo aiuti: http://matplotlib.1069221.n5.nabble.com/How-to-draw-a-specific- country-by-basemap-td15744.html –
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/) –