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ı?
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ı?
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()
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
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
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
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ç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/
Arnavutlukunuz batıyor. Pek çoğunun farkına varamayacak: D – theta
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 –
@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. –
Belki kullanışlı http: //www.geophysique. be/2011/01/27/matplotlib-basemap-tutorial-07-shapefiles-unleached/ – unutbu
Bu yardımcı olduğuna inanıyorum: http://matplotlib.1069221.n5.nabble.com/How-to-draw-a-specific- country-by-basemap-td15744.html –
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/) –