2012-11-15 5 views
15

Merhaba Bazı ülkelerle belirli bir renkte doldurulmuş pythons taban haritası kullanarak bir harita çizmeye çalışıyorum.Python basemapındaki ülkeleri doldurun

Orada hızlı ve kolay bir çözüm var mı?

+2

Belki kullanışlı http: //www.geophysique. be/2011/01/27/matplotlib-basemap-tutorial-07-shapefiles-unleached/ – unutbu

+0

Bu yardımcı olduğuna inanıyorum: http://matplotlib.1069221.n5.nabble.com/How-to-draw-a-specific- country-by-basemap-td15744.html –

+2

Bu yorumlar için teşekkürler, en çok nerede yardımcı olurlar. Ayrıca, aradığımı gösteren ücretsiz ülke verisi olan bir site buldum: [http://www.naturalearthdata.com/](http://www.naturalearthdata.com/) –

cevap

12

Daha önce @unutbu tarafından söylendiği gibi, Thomas'ın yazdığı here, tam olarak neyin peşinde olduğunuzdur.

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

Lütfen cevabın bu kısımdaki önemli kısımlarını bu sitede veya postalama risklerinizin silinmesi gerektiğini unutmayın. ['Linkten biraz daha fazlası' olan cevaplardan bahsedildiği yerdeki SSS bölümüne bakın.] (Http: // stackoverflow .com/faq # deletion) İsterseniz bağlantıyı yine de ekleyebilirsiniz, ancak sadece 'referans' olarak. Cevap, bağlantıya ihtiyaç duymadan kendi başına kalmalıdır. – Taryn

+1

Teşekkürler @bluefeet - Bunun neden böyle olduğunu anlayabiliyorum. Bazı yeni bilgiler vermek için cevabı güncelledim (orijinal bağlantıyı çoğaltmadan, telif hakkına sahip olmadım). Alkış, – pelson

+0

shpreader.natural_earth çağırıyor bana bir http 404 bulunamadı hata veriyor, görünüşe göre onu indirmek için çalışır? – Leo

9

Pelson gelen cevap esinlenerek, ben post:

hafifçe http://scitools.org.uk/cartopy/docs/latest/tutorials/using_the_shapereader.html den adapte edilebilir (v0.7 olarak) Cartopy, ilgili kodu ile bunu istesin sahip olduğum çözüm. En iyisi olan size bırakacağım, o anda herhangi bir cevabı kabul etmeyeceğim.);

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

Bu

İşte doğru renk (çok şık değil biliyorum) 'de Arnavutluk'ta nasıl doldurulacağını benim örnektir sonuç

example for filling in countries in different colours

olduğunu.

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

Diğer tüm şekilleri yaptıktan sonra bunu yapmanız önemlidir. Belki bu kodun bir kısmından kurtulabilirsin, ama benim için yeterli olduğunu söylediğim gibi. ad veya kıtaya göre başvurum ben renkli contries için

, bu nedenle bu satırlar: Bu Web sitesinden aldım kullanılan

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

veriler: http://www.naturalearthdata.com/

+2

Arnavutlukunuz batıyor. Pek çoğunun farkına varamayacak: D – theta

+0

Evet, aslında aynısı Ermenistan'a da oluyor. Daha sonra bu iki ülkeyi açıkça doldurmak suretiyle bir iş ortamına gitmeliydim.Naturalearthdata gelen insanlar ile sorgulama ve ben bunu benim için tamir ettim ben bu kadar takip etmedim sonuç vermedi –

+0

@red_tiger Ben Arjantin ve Angola ile aynı sorun var. Çözümünüzü "Arnavutluk Sorunu" na gönderir misiniz? NaturalEarth'daki insanlar ne dedi? Teşekkürler. –