2012-11-15 35 views
15

Xin chào Tôi đang cố gắng vẽ bản đồ bằng cách sử dụng sơ đồ nền pythons với một số quốc gia được điền vào một màu nhất định.Điền vào các quốc gia trong sơ đồ nền python

Có giải pháp nhanh chóng và dễ dàng không?

+2

lẽ hữu ích: http: //www.geophysique. là/2011/01/27/matplotlib-basemap-tutorial-07-shapefiles-unleached/ – unutbu

+0

Tôi tin rằng điều này sẽ giúp: http://matplotlib.1069221.n5.nabble.com/How-to-draw-a-specific- country-by-basemap-td15744.html –

+2

Cảm ơn những nhận xét đó, chúng hữu ích nhất. Tôi cũng tìm thấy trang web có dữ liệu quốc gia miễn phí, đó chỉ là những gì tôi đang tìm kiếm: [http://www.naturalearthdata.com/](http://www.naturalearthdata.com/) –

Trả lời

12

Như đã được đề cập bởi @unutbu, bài đăng của Thomas 'here chính xác là những gì bạn đang làm sau.

Nếu bạn muốn làm điều này với Cartopy, mã tương ứng (trong v0.7) có thể được chuyển thể từ http://scitools.org.uk/cartopy/docs/latest/tutorials/using_the_shapereader.html hơi:

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

Xin lưu ý rằng bạn nên đăng các phần thiết yếu của câu trả lời ở đây, trên trang này, hoặc bài đăng của bạn có nguy cơ bị xóa [Xem Câu hỏi thường gặp ở đó câu hỏi đề cập đến câu trả lời 'không chỉ là liên kết'.] (Http: // stackoverflow .com/faq # deletion) Bạn vẫn có thể bao gồm liên kết nếu bạn muốn, nhưng chỉ là một 'tham chiếu'. Câu trả lời nên tự đứng lên mà không cần liên kết. – Taryn

+1

Cảm ơn @bluefeet - Tôi có thể thấy tại sao điều đó lại xảy ra. Tôi đã cập nhật câu trả lời để cung cấp một số thông tin mới (mà không cần sao chép liên kết gốc mà tôi không sở hữu bản quyền). Chúc mừng, – pelson

+0

Gọi shpreader.natural_earth cho tôi lỗi http 404 không tìm thấy, có vẻ như cố gắng tải xuống? – Leo

9

Lấy cảm hứng từ câu trả lời từ pelson, tôi gửi giải pháp tôi có. Tôi sẽ để nó cho bạn hoạt động tốt nhất, vì vậy tôi sẽ không chấp nhận bất kỳ câu trả lời nào vào lúc này.

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

Đây là kết quả

example for filling in countries in different colours

Dưới đây là ví dụ của tôi làm thế nào để điền vào Albania trong màu chính xác (không phải là rất tao nhã tôi biết;)).

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

Điều quan trọng là bạn làm điều này sau khi bạn đã thực hiện tất cả các hình dạng khác. Có lẽ bạn có thể loại bỏ một số phần của mã này, nhưng như tôi đã nói nó là đủ cho tôi.

Đối với ứng dụng tôi contries màu của tôi theo tên hoặc lục địa, do đó những dòng này:

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

Dữ liệu sử dụng tôi nhận được từ trang web này: http://www.naturalearthdata.com/

+2

Albania của bạn bị chìm. Không phải là nhiều người sẽ nhận thấy: D – theta

+0

Vâng, thực sự điều tương tự cũng xảy ra với Armenia. Tôi đã phải làm việc với arround, bằng cách điền đầy đủ hai quốc gia này sau đó.Sự quan tâm với những người từ naturalearthdata đã không kết luận và tôi đã không làm theo điều này một khi tôi đã sửa nó cho tôi –

+0

@red_tiger Tôi có cùng một vấn đề với Argentina và Angola. Bạn có thể đăng giải pháp của mình lên "vấn đề Albania" không? Những gì các folks tại NaturalEarth nói? Cảm ơn. –

Các vấn đề liên quan