over instalar etopo continents basemap python matplotlib matplotlib-basemap

instalar - maps on python



Rellena los paĆ­ses en el mapa base de python (3)

Actualizando la respuesta de @pelson para Python 3:

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) print(countries_shp) # 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''], next(earth_colors)) ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolor=next(earth_colors), label=country.attributes[''NAME_LONG'']) plt.show()

Hola, estoy tratando de trazar un mapa usando un mapa base de pitones con algunos países rellenados de un color determinado.

¿Hay una solución rápida y fácil por ahí?


Como ya lo dijo @unutbu, la publicación de Thomas geophysique.be/2011/01/27/… es exactamente lo que está buscando.

Si desea hacer esto con Cartopy, el código correspondiente (en v0.7) se puede adaptar de http://scitools.org.uk/cartopy/docs/latest/tutorials/using_the_shapereader.html ligeramente:

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


Inspirado por la respuesta de pelson, publico la solución que tengo. Te lo dejaré a ti, el que funcione mejor, por lo que no aceptaré ninguna respuesta en este 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)

Este es el resultado

Aquí está mi ejemplo de cómo rellenar Albania en el color correcto (no muy elegante, lo sé;)).

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

Es importante que hagas esto después de haber hecho todas las otras formas. Quizás puedas deshacerte de alguna parte de este código, pero como dije, fue suficiente para mí.

Para mi aplicación coloreé los colores por nombre o continente, por lo tanto estas líneas:

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

Los datos utilizados que obtuve de este sitio web: http://www.naturalearthdata.com/