In [249]:
import requests, pandas as pd, numpy as np, json
from requests import session
from bs4 import BeautifulSoup

In [250]:
metros=json.loads(open('metrosy.json','r').read())

In [251]:
metro=metros['https://www.metrolinemap.com/metro/budapest/']

In [252]:
!pip install area


Requirement already satisfied: area in c:\programdata\anaconda3\lib\site-packages (1.1.1)

In [253]:
from area import area
obj = {'type':'Polygon','coordinates':[[[-180,-90],[-180,90],[180,90],[180,-90],[-180,-90]]]}
area(obj) #earth area m^2, should be 511207893395811.06


Out[253]:
511207893395811.06

In [35]:
from math import radians, cos, sin, asin, sqrt

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r

In [38]:
haversine( 144.963165,-37.814251,-0.126236,51.500153) #should be 16903


Out[38]:
16903.81220969094

In [229]:
systemlengths={}
areas={}

In [241]:
for m in metros:
    metro=metros[m]
    segments=[]
    segarea={'type':'Polygon','coordinates':[[]]}
    systemlength=0
    for line in metro['lines']:
        segments.append([(line['path'][i],line['path'][i+1]) for i in range(len(line['path'])-1)])
    segmentlist=list(set([str(j) for i in segments for j in i]))
    for s in segmentlist:
        x=[float(i.replace('"','').replace('{','').replace('}','').replace('lat','').replace('lng','')\
         .replace('(','').replace(')','').replace(':','').replace("'",'').strip()) for i in s.split(',')]
        l=haversine(x[1],x[0],x[3],x[2])
        systemlength+=l
        segarea['coordinates'][0].append([x[1],x[0]])
    systemlengths[m]=systemlength
    areas[m]=area(segarea)

In [242]:
areas


Out[242]:
{'https://www.metrolinemap.com/metro/algiers/': 10148254.756227862,
 'https://www.metrolinemap.com/metro/cairo/': 242698817.98211765,
 'https://www.metrolinemap.com/metro/yerevan/': 3569421.4539765343,
 'https://www.metrolinemap.com/metro/baku/': 48206690.86507819,
 'https://www.metrolinemap.com/metro/beijing/': 1160417867.0692737,
 'https://www.metrolinemap.com/metro/changchun/': 23545871.683226936,
 'https://www.metrolinemap.com/metro/changsha/': 88765827.17451623,
 'https://www.metrolinemap.com/metro/chengdu/': 295314543.9688467,
 'https://www.metrolinemap.com/metro/chongqing/': 61004249.159951344,
 'https://www.metrolinemap.com/metro/dalian/': 33587233.34484719,
 'https://www.metrolinemap.com/metro/dongguan/': 33264378.950137135,
 'https://www.metrolinemap.com/metro/fuzhou/': 970266.9152781803,
 'https://www.metrolinemap.com/metro/guangzhou/': 921190749.4443042,
 'https://www.metrolinemap.com/metro/guiyang/': 54781701.751969546,
 'https://www.metrolinemap.com/metro/hangzhou/': 86895536.88891415,
 'https://www.metrolinemap.com/metro/harbin/': 2590514.75338812,
 'https://www.metrolinemap.com/metro/hefei/': 10934463.62736521,
 'https://www.metrolinemap.com/metro/hong-kong/': 159527987.65328848,
 'https://www.metrolinemap.com/metro/jinan/': 9695940.194946833,
 'https://www.metrolinemap.com/metro/kunming/': 92075341.21821313,
 'https://www.metrolinemap.com/metro/nanchang/': 77721484.04897167,
 'https://www.metrolinemap.com/metro/nanjing/': 674502633.5846773,
 'https://www.metrolinemap.com/metro/nanning/': 45556400.44731928,
 'https://www.metrolinemap.com/metro/ningbo/': 18728068.186677244,
 'https://www.metrolinemap.com/metro/qingdao/': 3371997.9811649597,
 'https://www.metrolinemap.com/metro/shanghai/': 984948771.7684757,
 'https://www.metrolinemap.com/metro/shenyang/': 3911455.032070395,
 'https://www.metrolinemap.com/metro/shenzhen/': 530124174.7687648,
 'https://www.metrolinemap.com/metro/shijiazhuang/': 34687345.84486729,
 'https://www.metrolinemap.com/metro/suzhou/': 259018551.96749586,
 'https://www.metrolinemap.com/metro/tianjin/': 187000059.3983578,
 'https://www.metrolinemap.com/metro/urumqi/': 2886671.286622099,
 'https://www.metrolinemap.com/metro/wenzhou/': 56641868.29531115,
 'https://www.metrolinemap.com/metro/wuhan/': 104382576.85488528,
 'https://www.metrolinemap.com/metro/wuxi/': 33583546.66179458,
 'https://www.metrolinemap.com/metro/xiamen/': 55309487.35920558,
 'https://www.metrolinemap.com/metro/xian/': 62704274.068342775,
 'https://www.metrolinemap.com/metro/zhengzhou/': 302031750.66146433,
 'https://www.metrolinemap.com/metro/tbilisi/': 159295953.01764774,
 'https://www.metrolinemap.com/metro/ahmedabad/': 984559.661053086,
 'https://www.metrolinemap.com/metro/bangalore/': 320194323.7841215,
 'https://www.metrolinemap.com/metro/chennai/': 131554523.90957206,
 'https://www.metrolinemap.com/metro/delhi/': 965024029.538739,
 'https://www.metrolinemap.com/metro/hyderabad/': 1122786984.1478512,
 'https://www.metrolinemap.com/metro/jaipur/': 11270541.687537111,
 'https://www.metrolinemap.com/metro/kochi/': 161331165.6194082,
 'https://www.metrolinemap.com/metro/kolkata/': 842887284.4838896,
 'https://www.metrolinemap.com/metro/lucknow/': 87743876.84820372,
 'https://www.metrolinemap.com/metro/mumbai/': 1641189.5971331394,
 'https://www.metrolinemap.com/metro/nagpur/': 8914813.75768718,
 'https://www.metrolinemap.com/metro/noida/': 175295066.0495032,
 'https://www.metrolinemap.com/metro/jakarta/': 11650356.328004705,
 'https://www.metrolinemap.com/metro/isfahan/': 73544115.95283933,
 'https://www.metrolinemap.com/metro/mashhad/': 95636598.10582699,
 'https://www.metrolinemap.com/metro/shiraz/': 11141682.425686583,
 'https://www.metrolinemap.com/metro/tabriz/': 2729411.133449746,
 'https://www.metrolinemap.com/metro/tehran/': 37658627.91679752,
 'https://www.metrolinemap.com/metro/fukuoka/': 67600517.88106763,
 'https://www.metrolinemap.com/metro/hiroshima/': 32802822.98608888,
 'https://www.metrolinemap.com/metro/kobe/': 17882433.760574322,
 'https://www.metrolinemap.com/metro/kyoto/': 12533854.071065517,
 'https://www.metrolinemap.com/metro/nagoya/': 9305570.956145901,
 'https://www.metrolinemap.com/metro/osaka/': 25866062.028548665,
 'https://www.metrolinemap.com/metro/sapporo/': 21029487.40566252,
 'https://www.metrolinemap.com/metro/sendai/': 13622256.206541738,
 'https://www.metrolinemap.com/metro/tokyo/': 185657497.8773638,
 'https://www.metrolinemap.com/metro/yokohama/': 53985084.01584881,
 'https://www.metrolinemap.com/metro/almaty/': 4622854.567655276,
 'https://www.metrolinemap.com/metro/pyongyang/': 658832.4272548942,
 'https://www.metrolinemap.com/metro/busan/': 26380988.407296676,
 'https://www.metrolinemap.com/metro/daegu/': 37145250.90273408,
 'https://www.metrolinemap.com/metro/daejeon/': 4600007.800830477,
 'https://www.metrolinemap.com/metro/gwangju/': 15465229.159068102,
 'https://www.metrolinemap.com/metro/seoul/': 8876422132.973063,
 'https://www.metrolinemap.com/metro/kuala-lumpur/': 59058164.42034836,
 'https://www.metrolinemap.com/metro/manila/': 91912116.39250344,
 'https://www.metrolinemap.com/metro/doha/': 76969517.39355227,
 'https://www.metrolinemap.com/metro/mecca/': 5722226.636200959,
 'https://www.metrolinemap.com/metro/singapore/': 187185172.27659327,
 'https://www.metrolinemap.com/metro/kaohsiung/': 85719693.70769788,
 'https://www.metrolinemap.com/metro/taipei/': 27721271.688992947,
 'https://www.metrolinemap.com/metro/taoyuan/': 239390730.0281716,
 'https://www.metrolinemap.com/metro/bangkok/': 120670399.71081497,
 'https://www.metrolinemap.com/metro/dubai/': 181291682.0544589,
 'https://www.metrolinemap.com/metro/tashkent/': 1043965.0825456482,
 'https://www.metrolinemap.com/metro/sydney/': 333465998.14756984,
 'https://www.metrolinemap.com/metro/vienna/': 58045597.75702936,
 'https://www.metrolinemap.com/metro/minsk/': 16563652.925604928,
 'https://www.metrolinemap.com/metro/brussels/': 81569927.74052931,
 'https://www.metrolinemap.com/metro/sofia/': 80801467.84342197,
 'https://www.metrolinemap.com/metro/prague/': 143669394.2530103,
 'https://www.metrolinemap.com/metro/copenhagen/': 50883494.52625209,
 'https://www.metrolinemap.com/metro/helsinki/': 21613522.583993305,
 'https://www.metrolinemap.com/metro/lille/': 719307090.4941878,
 'https://www.metrolinemap.com/metro/lyon/': 34121659.00080945,
 'https://www.metrolinemap.com/metro/marseille/': 20257560.216884624,
 'https://www.metrolinemap.com/metro/paris/': 149891336.37716967,
 'https://www.metrolinemap.com/metro/rennes/': 7573187.762534562,
 'https://www.metrolinemap.com/metro/toulouse/': 230641017.1896978,
 'https://www.metrolinemap.com/metro/berlin/': 328128083.7644674,
 'https://www.metrolinemap.com/metro/hamburg/': 232421411.6754951,
 'https://www.metrolinemap.com/metro/munich/': 776700228.735614,
 'https://www.metrolinemap.com/metro/nuremberg/': 41415660.0301579,
 'https://www.metrolinemap.com/metro/athens/': 111582005.97913149,
 'https://www.metrolinemap.com/metro/budapest/': 6806629.321756423,
 'https://www.metrolinemap.com/metro/brescia/': 104923191.82649693,
 'https://www.metrolinemap.com/metro/catania/': 3361297.8269672217,
 'https://www.metrolinemap.com/metro/genoa/': 3551716.637387736,
 'https://www.metrolinemap.com/metro/milan/': 62416494.76222528,
 'https://www.metrolinemap.com/metro/naples/': 72132471.15987897,
 'https://www.metrolinemap.com/metro/rome/': 22016112.277983744,
 'https://www.metrolinemap.com/metro/turin/': 13262140.334292965,
 'https://www.metrolinemap.com/metro/amsterdam/': 46440370.76308985,
 'https://www.metrolinemap.com/metro/rotterdam/': 372491773.2574045,
 'https://www.metrolinemap.com/metro/oslo/': 73821702.66573168,
 'https://www.metrolinemap.com/metro/warsaw/': 77280419.50922848,
 'https://www.metrolinemap.com/metro/lisbon/': 25007248.243680462,
 'https://www.metrolinemap.com/metro/bucharest/': 28825199.912643563,
 'https://www.metrolinemap.com/metro/kazan/': 50125594.25736276,
 'https://www.metrolinemap.com/metro/moscow/': 159906018.82202372,
 'https://www.metrolinemap.com/metro/nizhny-novgorod/': 21250299.86439354,
 'https://www.metrolinemap.com/metro/novosibirsk/': 20267236.001267057,
 'https://www.metrolinemap.com/metro/saint-petersburg/': 164249691.31652677,
 'https://www.metrolinemap.com/metro/samara/': 19553189.984741747,
 'https://www.metrolinemap.com/metro/yekaterinburg/': 15674625.673328,
 'https://www.metrolinemap.com/metro/barcelona/': 136701159.36758786,
 'https://www.metrolinemap.com/metro/bilbao/': 55177567.004056305,
 'https://www.metrolinemap.com/metro/madrid/': 48394397.87809309,
 'https://www.metrolinemap.com/metro/stockholm/': 115413554.96248172,
 'https://www.metrolinemap.com/metro/lausanne/': 39415487.24475845,
 'https://www.metrolinemap.com/metro/adana/': 30554752.867489647,
 'https://www.metrolinemap.com/metro/ankara/': 1240069828.784511,
 'https://www.metrolinemap.com/metro/bursa/': 10292378.878376666,
 'https://www.metrolinemap.com/metro/istanbul/': 379661466.8160392,
 'https://www.metrolinemap.com/metro/izmir/': 10755235.87184367,
 'https://www.metrolinemap.com/metro/dnipro/': 1183849.4817915973,
 'https://www.metrolinemap.com/metro/kharkiv/': 4043598.133962507,
 'https://www.metrolinemap.com/metro/kiev/': 63852031.00835111,
 'https://www.metrolinemap.com/metro/glasgow/': 9391788.585148584,
 'https://www.metrolinemap.com/metro/london/': 2740951137.9110174,
 'https://www.metrolinemap.com/metro/newcastle/': 326941575.4845307,
 'https://www.metrolinemap.com/metro/montreal/': 160570003.5157197,
 'https://www.metrolinemap.com/metro/toronto/': 724130201.9761267,
 'https://www.metrolinemap.com/metro/vancouver/': 1513365264.9789724,
 'https://www.metrolinemap.com/metro/santo-domingo/': 10984454.498148741,
 'https://www.metrolinemap.com/metro/mexico-city/': 235301830.24612716,
 'https://www.metrolinemap.com/metro/monterrey/': 122698141.08669482,
 'https://www.metrolinemap.com/metro/panama-city/': 184606125.8467296,
 'https://www.metrolinemap.com/metro/puerto-rico/': 95416150.49681675,
 'https://www.metrolinemap.com/metro/atlanta/': 227727059.88888818,
 'https://www.metrolinemap.com/metro/baltimore/': 22007276.56729087,
 'https://www.metrolinemap.com/metro/boston/': 59882064.11427209,
 'https://www.metrolinemap.com/metro/chicago/': 148168040.56720617,
 'https://www.metrolinemap.com/metro/cleveland/': 26412812.84199494,
 'https://www.metrolinemap.com/metro/los-angeles/': 1228621626.0433564,
 'https://www.metrolinemap.com/metro/miami/': 363832827.08017176,
 'https://www.metrolinemap.com/metro/new-york-city/': 265937042.76117757,
 'https://www.metrolinemap.com/metro/philadelphia/': 62095060.52215037,
 'https://www.metrolinemap.com/metro/san-francisco/': 62523741.430291995,
 'https://www.metrolinemap.com/metro/washington/': 121686859.850133,
 'https://www.metrolinemap.com/metro/buenos-aires/': 8721216.877443496,
 'https://www.metrolinemap.com/metro/belo-horizonte/': 102524087.62286305,
 'https://www.metrolinemap.com/metro/brasilia/': 54910557.019499786,
 'https://www.metrolinemap.com/metro/porto-alegre/': 65306224.222087584,
 'https://www.metrolinemap.com/metro/recife/': 136373085.36041984,
 'https://www.metrolinemap.com/metro/rio-de-janeiro/': 767641791.3078365,
 'https://www.metrolinemap.com/metro/salvador/': 86172808.32854131,
 'https://www.metrolinemap.com/metro/sao-paulo/': 411751647.03020865,
 'https://www.metrolinemap.com/metro/santiago/': 66279160.82040033,
 'https://www.metrolinemap.com/metro/medellin/': 17496736.091136232,
 'https://www.metrolinemap.com/metro/lima/': 74743873.66074201,
 'https://www.metrolinemap.com/metro/caracas/': 35969720.79749123}

Population


In [114]:
pop={}
errors=[]

In [115]:
for m in metros:
    city=m.split('/')[-2]
    country=metros[m]['geo']['country'].lower()
    url3='http://population.city/'+country+'/'+city+'/'
    #print(url3)
    response = requests.get(url3)
    soup = BeautifulSoup(response.content)
    em=soup.findAll('em')
    if em:
        pop[m]=float(em[0].text[:-1].replace(' ',''))
        print('OK',city)
    else:
        print('ERROR',city)
        errors.append(city)


OK algiers
OK cairo
OK yerevan
ERROR baku
OK beijing
OK changchun
OK changsha
OK chengdu
OK chongqing
OK dalian
OK dongguan
OK fuzhou
OK guangzhou
OK guiyang
OK hangzhou
OK harbin
OK hefei
ERROR hong-kong
OK jinan
OK kunming
OK nanchang
OK nanjing
OK nanning
OK ningbo
OK qingdao
OK shanghai
OK shenyang
OK shenzhen
OK shijiazhuang
OK suzhou
OK tianjin
ERROR urumqi
OK wenzhou
OK wuhan
OK wuxi
OK xiamen
OK xian
OK zhengzhou
ERROR tbilisi
OK ahmedabad
OK bangalore
OK chennai
OK delhi
OK hyderabad
OK jaipur
ERROR kochi
OK kolkata
OK lucknow
OK mumbai
OK nagpur
OK noida
OK jakarta
ERROR isfahan
ERROR mashhad
ERROR shiraz
ERROR tabriz
ERROR tehran
OK fukuoka
OK hiroshima
OK kobe
OK kyoto
OK nagoya
OK osaka
OK sapporo
OK sendai
OK tokyo
OK yokohama
ERROR almaty
ERROR pyongyang
ERROR busan
ERROR daegu
ERROR daejeon
ERROR gwangju
ERROR seoul
ERROR kuala-lumpur
OK manila
ERROR doha
ERROR mecca
ERROR singapore
ERROR kaohsiung
ERROR taipei
ERROR taoyuan
OK bangkok
ERROR dubai
ERROR tashkent
OK sydney
OK vienna
OK minsk
OK brussels
OK sofia
ERROR prague
OK copenhagen
OK helsinki
OK lille
OK lyon
OK marseille
OK paris
OK rennes
OK toulouse
OK berlin
OK hamburg
OK munich
ERROR nuremberg
OK athens
OK budapest
OK brescia
OK catania
OK genoa
ERROR milan
ERROR naples
OK rome
OK turin
OK amsterdam
OK rotterdam
OK oslo
OK warsaw
OK lisbon
OK bucharest
OK kazan
OK moscow
ERROR nizhny-novgorod
OK novosibirsk
OK saint-petersburg
OK samara
OK yekaterinburg
OK barcelona
ERROR bilbao
OK madrid
OK stockholm
OK lausanne
OK adana
OK ankara
OK bursa
OK istanbul
OK izmir
ERROR dnipro
OK kharkiv
OK kiev
ERROR glasgow
ERROR london
ERROR newcastle
OK montreal
OK toronto
OK vancouver
ERROR santo-domingo
OK mexico-city
OK monterrey
OK panama-city
ERROR puerto-rico
ERROR atlanta
ERROR baltimore
ERROR boston
ERROR chicago
ERROR cleveland
ERROR los-angeles
ERROR miami
ERROR new-york-city
ERROR philadelphia
ERROR san-francisco
ERROR washington
OK buenos-aires
OK belo-horizonte
OK brasilia
OK porto-alegre
OK recife
OK rio-de-janeiro
OK salvador
OK sao-paulo
OK santiago
ERROR medellin
OK lima
ERROR caracas

In [144]:
def cc(c):
    return c.replace(' ','-')
def cy(c):
    if c=='kochi':return 'cochin'
    if c=='milan':return 'milano'
    if c=='nuremberg':return 'nuernberg'
    if c=='naples':return 'napoli'
    return c

In [159]:
#https://all-populations.com/
pop['https://www.metrolinemap.com/metro/baku/']=2150000.0
pop['https://www.metrolinemap.com/metro/hong-kong/']=7496981.0
pop['https://www.metrolinemap.com/metro/urumqi/']=3112559.0
pop['https://www.metrolinemap.com/metro/tbilisi/']=1062282.0
pop['https://www.metrolinemap.com/metro/isfahan/']=1602110.0
pop['https://www.metrolinemap.com/metro/mashhad/']=2427316.0
pop['https://www.metrolinemap.com/metro/shiraz/']=1227331.0
pop['https://www.metrolinemap.com/metro/tabriz/']=1398060.0
pop['https://www.metrolinemap.com/metro/tehran/']=7797520.0
pop['https://www.metrolinemap.com/metro/almaty/']=1534353.0
pop['https://www.metrolinemap.com/metro/pyongyang/']=3255288.0
pop['https://www.metrolinemap.com/metro/kuala-lumpur/']=1809699.0
pop['https://www.metrolinemap.com/metro/doha/']=796947.0
pop['https://www.metrolinemap.com/metro/mecca/']=1534731.0
pop['https://www.metrolinemap.com/metro/singapore/']=5469724.0
pop['https://www.metrolinemap.com/metro/kaohsiung/']=2769072.0
pop['https://www.metrolinemap.com/metro/taipei/']=2612605.0
pop['https://www.metrolinemap.com/metro/taoyuan/']=2245162.0
pop['https://www.metrolinemap.com/metro/tashkent/']=2135700.0
pop['https://www.metrolinemap.com/metro/nizhny-novgorod/']=1250615.0
pop['https://www.metrolinemap.com/metro/bilbao/']=353173.0
pop['https://www.metrolinemap.com/metro/dnipro/']=984423.0
pop['https://www.metrolinemap.com/metro/newcastle/']=271600.0
pop['https://www.metrolinemap.com/metro/santo-domingo/']=3339410.0
pop['https://www.metrolinemap.com/metro/puerto-rico/']=395326.0
pop['https://www.metrolinemap.com/metro/medellin/']=2486723.0
pop['https://www.metrolinemap.com/metro/caracas/']=1836286.0
pop['https://www.metrolinemap.com/metro/washington/']=702455.0

In [160]:
for m in metros:
    if e in errors:
        if m not in pop:
            city=cy(m.split('/')[-2])
            country=cc(metros[m]['geo']['country'].lower())
            url3='http://population.city/'+country+'/'+city+'/'
            #print(url3)
            response = requests.get(url3)
            soup = BeautifulSoup(response.content)
            em=soup.findAll('em')
            if em:
                pop[m]=float(em[0].text[:-1].replace(' ',''))
                print('OK',city)
            else:
                print('ERROR',city,country,m)

In [246]:
data=[]

In [247]:
for m in metros:
    dummy={}
    dummy['Population (M)']=np.round(pop[m]/1000000,2)
    dummy['System length (km)']=np.round(systemlengths[m],2)
    metro=metros[m]
    dummy['Name']=metro['name'].replace('Metropolitan','').replace('Metro','').replace('Subway','').replace('Rail','').replace('Transit','').\
    replace('Municipal','').replace('U-Bahn','').\
    replace('Underground','').replace('City','').strip()
    dummy['Year started']=metro['year']
    dummy['Description']=metro['desc']
    dummy['Continent']=metro['geo']['continent'].replace('Australia / Oceania','Australia')
    dummy['Country']=metro['geo']['country'].replace('United States','USA').replace('United Kingdom','UK')
    dummy['# of lines']=len(metro['lines'])
    dummy['# of stations']=len(metro['stations'])
    dummy['Full name']=metro['name']
    dummy['(km) of lines/1M people']=np.round((dummy['System length (km)'])/dummy['Population (M)'],2)
    dummy['# of stations/1M people']=np.round(dummy['# of stations']/dummy['Population (M)'],2)
    dummy['Average line length (km)']=np.round(dummy['System length (km)']/dummy['# of lines'],2)
    dummy['Average distance between stations (km)']=np.round(dummy['System length (km)']/dummy['# of stations'],2)
    dummy['Total area covered (km²)']=np.round(areas[m]/1000000,2)
    data.append(dummy)

In [248]:
pd.DataFrame(data).to_csv('data.csv')

In [ ]: