from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
# city population in 2017
locations ={"Sydney":5131326,"Melbourne":4850740,"Brisbane":2408223,"Adelaide":1333927,"Perth":2043138,"Hobart":226884,"Darwin":146612,"Canberra":410301}# Latitude and Longitude in degrees
names ={"Sydney":(-33.86785,151.20732),"Melbourne":(-37.8142,144.96332),"Brisbane":(-27.46794,153.02809),"Adelaide":(-34.92866,138.59863),"Perth":(-31.95224,115.8614),"Hobart":(-42.87936,147.32941),"Darwin":(-12.46113,130.84185),"Canberra":(-35.28346,149.12807)}# setup mercator map projection
basemap = Basemap(projection="merc",
resolution="h",
area_thresh=0.1,
llcrnrlon=112,llcrnrlat=-45,
urcrnrlon=155,urcrnrlat=-8)# draw several map elements
basemap.drawcoastlines(linewidth=0.6,linestyle="-",color="#b7cfe9",zorder=3)
basemap.drawrivers(linewidth=0.8,linestyle="-",color="#689CD2",zorder=2)
basemap.fillcontinents(color="#BF9E30",lake_color="#689CD2",zorder=1)
basemap.drawmapboundary(color="gray",fill_color="#689CD2")
basemap.drawmeridians(np.arange(0,360,15),color="#4e8bca",labels=[0,0,0,1],labelstyle="+/-")
basemap.drawparallels(np.arange(-90,90,15),color="#4e8bca",labels=[1,1,0,0],labelstyle="+/-")# convert lon/lat (in degrees) to x/y map projection coordinates (in meters)# longitude is transformed into x and latitude is transformed into y
names_values =[]
names_keys =list(names.keys())for i,name inenumerate(names_keys):
names_values.append(names[name])
lat_x,long_y =list(zip(*names_values))
x,y = basemap(long_y,lat_x)# draw city markers and add text to markers
size_factor =80.0
offset_factor =21000
rotation =30
max_population =max(locations.values())for city_name,city_x,city_y inzip(names_keys,x,y):
size =(size_factor/max_population)*locations[city_name]
x_offset = offset_factor
y_offset = offset_factor
basemap.scatter(city_x,
city_y,
s=size,
facecolor="w",
edgecolors="r",
linewidths=2.0,
zorder=10)
plt.text(city_x+x_offset,city_y+y_offset,city_name)# setup map title
font =dict(family="serif",fontsize=15,weight="bold")
plt.title("Australian Population of Capital City",**font)
plt.show()
import datetime
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
# setup miller projection
basemap = Basemap(projection="mill",
resolution="h",
area_thresh=0.1,
llcrnrlon=-180,
llcrnrlat=-90,
urcrnrlon=180,
urcrnrlat=90)# draw coastlines
basemap.drawcoastlines(linewidth=0.6,zorder=2)# draw mapboundary
basemap.drawmapboundary(fill_color="aqua")# fill continents with color "coral", and lake "aqua"
basemap.fillcontinents(color="coral",lake_color="aqua",zorder=1)# draw meridians and parallels
basemap.drawmeridians(np.arange(-120,150,60),linewidth=0.6,labels=[0,0,0,1])
basemap.drawparallels(np.arange(-60,80,30),linewidth=0.6,labels=[1,0,0,0])# shade the night areas, and use current time in UTC
date = datetime.datetime.utcnow()
basemap.nightshade(date)# format title with date and time
content ="Shade dark regions of the map %s (UTC)"
dtFormat ="%d %b %Y %H:%M:%S"
stringTime = date.strftime(dtFormat)
plt.title(content % stringTime,fontsize=15)
plt.show()
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
classMapDisVisualization(Basemap):# get city namesdefgetCityNames(self,names):
namesKeys =list(names.keys())return namesKeys
# define distance between cityA and cityBdefcitiesDistance(self,x,y):
d = np.power(np.power(x[0]-y[0],2)+np.power(x[1]-y[1],2),0.5)
distance =round(d,4)return distance
# compute distance between target city and every other citydefcenterCityDistance(self,city,names):
distanceDict ={}
namesKeys = self.getCityNames(names)for i,name inenumerate(namesKeys):if name != city:
distanceDict[name]= self.citiesDistance(names[city],names[name])return distanceDict
# compute line width and line colordefsetcolorandwidth(self,city,names):
size_factor =2.0
namesKeys = self.getCityNames(names)
distanceDict = self.centerCityDistance(city,names)
distanceList =list(distanceDict.values())
maxDistance =max(distanceList)for i,name inenumerate(namesKeys):if name != city:
self.drawgreatcircle(names[city][1],names[city][0],
names[name][1],names[name][0],
linewidth=size_factor,
color=mpl.cm.Blues(distanceDict[name]/float(maxDistance)))# visualize city distance on the mapdefshowmap(self,city,names):
self.setcolorandwidth(city,names)
namesKeys = self.getCityNames(names)
number =len(namesKeys)
titleContent ="a map of visualizing distance between %s and every other city (%d cities)"
font =dict(family="serif",fontsize=15,weight="black")
plt.title(titleContent %(city,(number-1)),fontdict=font)
plt.show()defmain(projection,city):# get a Basemap instance
m = MapDisVisualization(projection=projection,
resolution="h",
area_thresh=0.1,
llcrnrlon=112,llcrnrlat=-50,
urcrnrlon=180,urcrnrlat=-8)# draw several elements on the map
m.drawcoastlines(linewidth=0.6,linestyle="-",zorder=2)
m.fillcontinents(alpha=0.5,zorder=1)
m.drawmapboundary(color="gray")
m.drawmeridians(np.arange(100,180,15),linewidth=0.4,labels=[0,0,0,1])
m.drawparallels(np.arange(-90,0,15),linewidth=0.4,labels=[1,0,0,0])# Latitude and Longitude in degrees
names ={"Sydney":(-33.86785,151.20732),"Wellington":(-41.28664,174.77557),"Brisbane":(-27.46794,153.02809),"Adelaide":(-34.92866,138.59863),"Perth":(-31.95224,115.8614),"Auckland":(-36.86667,174.76667),"Darwin":(-12.46113,130.84185),"Canberra":(-35.28346,149.12807)}#show the distance between Sydney and every other city
m.showmap(city,names)if __name__ =="__main__":# use projection mercator and choose Sydney
main("merc","Sydney")