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?
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?
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()
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
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
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
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ả
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/
Albania của bạn bị chìm. Không phải là nhiều người sẽ nhận thấy: D – theta
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 –
@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. –
lẽ hữu ích: http: //www.geophysique. là/2011/01/27/matplotlib-basemap-tutorial-07-shapefiles-unleached/ – unutbu
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 –
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/) –