OpenStreetMap Data Cleaning Project Origin Code

Get a sample

In [6]:
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import xml.etree.ElementTree as ET  # Use cElementTree or lxml if too slow

OSM_FILE = "beijing_china.osm"  # Replace this with your osm file
SAMPLE_FILE = "beijing_sample2222.osm"

k = 100 # Parameter: take every k-th top level element

def get_element(osm_file, tags=('node', 'way', 'relation')):
    """Yield element if it is the right type of tag

    Reference:
    http://stackoverflow.com/questions/3095434/inserting-newlines-in-xml-file-generated-via-xml-etree-elementtree-in-python
    """
    context = iter(ET.iterparse(osm_file, events=('start', 'end')))
    _, root = next(context)
    for event, elem in context:
        if event == 'end' and elem.tag in tags:
            yield elem
            root.clear()


with open(SAMPLE_FILE, 'wb') as output:
    output.write('<?xml version="1.0" encoding="UTF-8"?>\n'.encode())
    output.write('<osm>\n  '.encode())

    # Write every kth top level element
    for i, element in enumerate(get_element(OSM_FILE)):
        if i % k == 0:
            output.write(ET.tostring(element, encoding='utf-8'))

    output.write('</osm>'.encode())
In [44]:
count_tags('beijing_china.osm')
Out[44]:
{'osm': 1,
 'bounds': 1,
 'node': 777694,
 'tag': 339853,
 'way': 115041,
 'nd': 928128,
 'relation': 5601,
 'member': 60922}
In [2]:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import pandas as pd
from bs4 import BeautifulSoup
import xml.etree.ElementTree as ET
import csv
import codecs
import pprint
import re
from collections import defaultdict
#import goslate
import sqlite3
In [3]:
def tags_info(filename,elem_tag,tag_k):
    '''this function can return tag information in ways or relation or nodes. elem_tag=[way,node,relation], tag_k = keys of tags
    that you are interested,such as tag_k =[name,name_zh,name_en...]'''
    tags_info_list = []
    tags_info_k = []
    for _,elem in ET.iterparse(filename,events=('start',)):
        if elem.tag == elem_tag:
            for child in elem:
                if child.tag == 'tag':
                    tags_info_k.append(child.attrib['k'])
                    if child.attrib['k']==tag_k:
                        
                        tags_info_list.append(child.attrib['v'])
        else:
            continue
    return tags_info_list
    
def count_tags(filename):
    tags = {}
    taglist = []
    for _,elem in ET.iterparse(filename,events=('start',)):
        taglist.append(elem.tag)
    for tag in taglist:
        if tag not in tags:
            tags[tag] = 1
        else:
            tags[tag] += 1
    return tags
        

def process():
    filename_path =  r'beijing_china.osm'
    with open(filename_path,'r',encoding='utf-8') as filename:
        
        #tags = count_tags(filename)
        tagsinfo = tags_info(filename,'node','cuisine')
    return set(tagsinfo)
hh = process()

Audit and Update data set

In [34]:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
    
mapping_dict = {
    'Road':'路',
    'Expressway':'高速公路',
    'Lu':'路',
    'lu':'路',
    'Hutong':'胡同',
    'hutong':'胡同',
    'Embassy':'大使馆',
    'Coffee':'咖啡厅'
}


def update_road_name(name,mapping_dict):
    name_list = name.split()
    if name_list[-1] in mapping_dict:
        name_list[-1] = mapping_dict[name_list[-1]]
        return ' '.join(name_list)
    else:
        return name
In [27]:
def update_cuisine(cuisine):
    return cuisine.split(';')[0]
def update_phone(phone):
    if len(phone) == 8:
        return '+86010'+phone
    elif len(phone) == 11:
        return '+86'+phone
    elif len(phone) >11:
        return phone.replace(' ','')
    elif len(phone) <8:
        return 'Error'+'+'+phone
    elif len(phone) >8 and len(phone) < 11:
        return 'Error'+'+'+phone
def update_source(source):
    import re
    sourcename = re.split(r'[,;_. ]',source)
    sourcename_0 = sourcename[0]
    reg_bing = re.compile(re.escape('bing'), re.IGNORECASE)
    reg_gps = re.compile(re.escape('gps'), re.IGNORECASE)
    reg_yahoo = re.compile(re.escape('yahoo'), re.IGNORECASE)
    reg_survey = re.compile(re.escape('survey'), re.IGNORECASE)
    sourcename_0 = reg_bing.sub('Bing', sourcename_0)
    sourcename_0 = reg_gps.sub('GPS', sourcename_0)
    sourcename_0 = reg_yahoo.sub('Yahoo', sourcename_0)
    sourcename_0 = reg_survey.sub('Survey', sourcename_0)
    if sourcename_0 not in ['Bing','GPS','Yahoo','Survey']:
        sourcename_0 = 'other'
    return sourcename_0

build dict format

In [32]:
OSM_PATH = "beijing_china.osm"
NODES_PATH = "nodes.csv"
NODE_TAGS_PATH = "nodes_tags.csv"
WAYS_PATH = "ways.csv"
WAY_NODES_PATH = "ways_nodes.csv"
WAY_TAGS_PATH = "ways_tags.csv"


PROBLEMCHARS = re.compile(r'[=\+/&<>;\'"\?%#$@\,\. \t\r\n]')
LOWER_COLON = re.compile(r'^([a-z]|_)+:([a-z]|_)+')

#SCHEMA = schema.schema

# Make sure the fields order in the csvs matches the column order in the sql table schema
NODE_FIELDS = ['id', 'lat', 'lon', 'user', 'uid', 'version', 'changeset', 'timestamp']
NODE_TAGS_FIELDS = ['id', 'key', 'value', 'type']
WAY_FIELDS = ['id', 'user', 'uid', 'version', 'changeset', 'timestamp']
WAY_TAGS_FIELDS = ['id', 'key', 'value', 'type']
WAY_NODES_FIELDS = ['id', 'node_id', 'position']


def shape_element(element, node_attr_fields=NODE_FIELDS, way_attr_fields=WAY_FIELDS,
                  problem_chars=PROBLEMCHARS, default_tag_type='regular'):
    """Clean and shape node or way XML element to Python dict"""

    node_attribs = {}
    way_attribs = {}
    way_nodes = []
    tags = []  # Handle secondary tags the same way for both node and way elements
    #tags_dict = {}
    way_nodes_dict = {}
    
    # YOUR CODE HERE
    if element.tag == 'node':
        for i in NODE_FIELDS:
            node_attribs[i] = element.attrib[i]
        if len(element):# this used to show if the element has child or not
            for child in element:
                tags_dict = {}
                if child.tag == 'tag':
                    problems = PROBLEMCHARS.match(child.attrib['k'])
                    if problems:
                        continue
                    else:
                        colon = LOWER_COLON.match(child.attrib['k'])
                        if colon:
                            tags_dict['type'] = child.attrib['k'].split(':',1)[0]
                            tags_dict['key'] = child.attrib['k'].split(':',1)[-1]
                        else:
                            tags_dict['type'] = 'regular'
                            tags_dict['key'] = child.attrib['k']
                        tags_dict['id'] = element.attrib['id']
                        tags_dict['value'] = child.attrib['v']
                       
                        if 'name' in tags_dict.values():
                            tags_dict['value'] = update_road_name(tags_dict['value'],mapping_dict)
                        elif 'phone' in tags_dict.values():
                            tags_dict['value'] = update_phone(tags_dict['value'])
                        elif 'source' in tags_dict.values():
                            tags_dict['value'] = update_source(tags_dict['value'])
                        elif 'cuisine' in tags_dict.values():
                            tags_dict['value'] = update_cuisine(tags_dict['value'])
                            #print (tags_dict['value'])
                        
                else:
                    continue
                tags.append(tags_dict)
                
        else:
            tags = []
        #print tags
        res33 = {'node': node_attribs, 'node_tags': tags}
        return res33
        ''' #这段代码用于调试
        for i in res33['node_tags']:
            if i['key'] == 'phone':
                print (i['value'])'''
    elif element.tag == 'way':
        for i in WAY_FIELDS:
            way_attribs[i] = element.attrib[i]
        
        tag_list_elem = []
        for elem in list(element):
            tag_list_elem.append(elem.tag)
        #print tag_list_elem
        count = 0
        if len(element):
            for child in element:
                tags_dict ={}
                nds_dict = {}
                if child.tag == 'tag':
                    problems = PROBLEMCHARS.match(child.attrib['k'])
                    if problems:
                        continue
                    else:
                        colon = LOWER_COLON.match(child.attrib['k'])
                        if colon:
                            tags_dict['type'] = child.attrib['k'].split(':',1)[0]
                            tags_dict['key'] = child.attrib['k'].split(':',1)[-1]
                        else:
                            tags_dict['type'] = 'regular'
                            tags_dict['key'] = child.attrib['k']
                        tags_dict['id'] = element.attrib['id']
                        #tags_dict['value'] = child.attrib['v']
                        if 'name' in tags_dict.values():
                            tags_dict['value'] = update_road_name(child.attrib['v'],mapping_dict)
                        elif 'phone' in tags_dict.values():
                            tags_dict['value'] = update_phone(child.attrib['v'])
                            #print (child.attrib['v'])
                        elif 'source' in tags_dict.values():
                            tags_dict['value'] = update_source(child.attrib['v'])
                        elif 'cuisine' in tags_dict.values():
                            tags_dict['value'] = update_cuisine(child.attrib['v'])
                        else:
                            tags_dict['value'] = child.attrib['v']
                            
                   
                    tags.append(tags_dict)
                    #pprint.pprint(tags_dict)
                if child.tag == 'nd':
                    nds_dict['id'] = element.attrib['id']
                    nds_dict['node_id'] = child.attrib['ref']
                    nds_dict['position'] = count
                    count += 1
                    way_nodes.append(nds_dict)
                    #pprint.pprint(nds_dict)
                #elif 'nd' not in tag_list_elem:
                    #way_nodes.append(nds_dict)
                    
        else:
            tags = []
        #print tags
        res = {'way': way_attribs, 'way_nodes': way_nodes, 'way_tags': tags}
        return res
    '''
        for i in res['way_tags']:
            if i['key'] == 'source':
                print (i['value'])'''
        
        #print (res)

Write into CSV

In [43]:
def get_element(osm_file, tags=('node', 'way', 'relation')):
    """Yield element if it is the right type of tag"""

    context = ET.iterparse(osm_file, events=('start','end'))
    _, root = next(context)
    for event, elem in context:
        if event == 'end' and elem.tag in tags:
            yield elem
            root.clear()
class UnicodeDictWriter(csv.DictWriter, object):
    """Extend csv.DictWriter to handle Unicode input"""

    def writerow(self, row):
        super(UnicodeDictWriter, self).writerow({
            k: (v.encode('utf-8') if isinstance(v, str) else v) for k, v in row.items()
        })

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)


# ================================================== #
#               Main Function                        #
# ================================================== #
def process_map(file_in):
    """Iteratively process each XML element and write to csv(s)"""

    with open(NODES_PATH, 'w',encoding='utf-8',newline = '') as nodes_file, \
         open(NODE_TAGS_PATH, 'w',encoding='utf-8',newline = '') as nodes_tags_file, \
         open(WAYS_PATH, 'w',encoding='utf-8',newline = '') as ways_file, \
         open(WAY_NODES_PATH, 'w',encoding='utf-8',newline = '') as way_nodes_file, \
         open(WAY_TAGS_PATH, 'w',encoding='utf-8',newline = '') as way_tags_file:

        nodes_writer = csv.DictWriter(nodes_file, NODE_FIELDS)
        node_tags_writer = csv.DictWriter(nodes_tags_file, NODE_TAGS_FIELDS)
        ways_writer = csv.DictWriter(ways_file, WAY_FIELDS)
        way_nodes_writer = csv.DictWriter(way_nodes_file, WAY_NODES_FIELDS)
        way_tags_writer = csv.DictWriter(way_tags_file, WAY_TAGS_FIELDS)

        nodes_writer.writeheader()# means write a row with the field name
        node_tags_writer.writeheader()
        ways_writer.writeheader()
        way_nodes_writer.writeheader()
        way_tags_writer.writeheader()

        #validator = cerberus.Validator()
        

        for element in get_element(file_in, tags=('node', 'way')):
            el = shape_element(element)
            
            if el:
                if element.tag == 'node':
                    # 这一段就是把shape_element得到的字典转化成csv,这里面是要一行一行地进行写入的
                    
                    nodes_writer.writerow(el['node'])
                    node_tags_writer.writerows(el['node_tags']) #好奇
                elif element.tag == 'way':
                    
                    ways_writer.writerow(el['way'])
                    way_nodes_writer.writerows(el['way_nodes'])
                    way_tags_writer.writerows(el['way_tags'])

process_map(OSM_PATH)
    

CSV to SQL

In [40]:
import sqlite3
conn = sqlite3.connect('p3_project.db')
c = conn.cursor()
In [ ]:
NODES_PATH = "nodes.csv"
NODE_TAGS_PATH = "nodes_tags.csv"
WAYS_PATH = "ways.csv"
WAY_NODES_PATH = "ways_nodes.csv"
WAY_TAGS_PATH = "ways_tags.csv"
In [41]:
# read csv to database by using pandas and sqlite
df_nodes = pd.read_csv(NODES_PATH)
df_nodes_tags = pd.read_csv(NODE_TAGS_PATH)
df_ways = pd.read_csv(WAYS_PATH)
df_ways_nodes = pd.read_csv(WAY_NODES_PATH)
df_ways_tags = pd.read_csv(WAY_TAGS_PATH)
df_nodes.to_sql('nodes', conn, if_exists='replace', index=False)
df_nodes_tags.to_sql('nodes_tags', conn, if_exists='replace', index=False, schema = NODE_TAGS_FIELDS)
df_ways.to_sql('ways', conn, if_exists='replace', index=False)
df_ways_tags.to_sql('ways_tags', conn, if_exists='replace', index=False)
df_ways_nodes.to_sql('ways_nodes', conn, if_exists='replace', index=False)
In [451]:
c.execute('select value,count(*) as num from nodes_tags where key = "cuisine" group by value order by num desc').fetchall()
Out[451]:
[('chinese', 190),
 ('american', 67),
 ('coffee_shop', 63),
 ('chicken', 55),
 ('pizza', 30),
 ('japanese', 28),
 ('italian', 19),
 ('burger', 18),
 ('sandwich', 13),
 ('international', 12),
 ('regional', 12),
 ('german', 8),
 ('asian', 7),
 ('korean', 5),
 ('noodles', 5),
 ('steak_house', 4),
 ('breakfast', 3),
 ('french', 3),
 ('indian', 3),
 ('kebab', 3),
 ('local', 3),
 ('mexican', 3),
 ('seafood', 3),
 ('thai', 3),
 ('vegetarian', 3),
 ('vietnamese', 3),
 ('Middle_Eastern', 2),
 ('dumplings', 2),
 ('hot_pot', 2),
 ('russian', 2),
 ('sushi', 2),
 ('taiwanese', 2),
 ('xinjiang', 2),
 ('Coffee,Tea,Beer,Cake', 1),
 ('Hot pot', 1),
 ('Hunan', 1),
 ('Shanxi', 1),
 ('Yunan', 1),
 ('arab', 1),
 ('asian_fusion', 1),
 ('bagel', 1),
 ('bakery,_sandwich', 1),
 ('bbq', 1),
 ('beef_bowl', 1),
 ('brazilian_bbq', 1),
 ('buffet', 1),
 ('cake', 1),
 ('cake_&_bread', 1),
 ('chuar', 1),
 ('chunbing', 1),
 ('coffee,beer,bar,cocktail,cake,chinese_rice,pasta...', 1),
 ('congee1', 1),
 ('donkey_burger', 1),
 ('donkey_meat', 1),
 ('donut', 1),
 ('fine_dining', 1),
 ('fish', 1),
 ('fried_chicken', 1),
 ('guilin_mifen', 1),
 ('hong_kong_food', 1),
 ('hotpot', 1),
 ('ice_cream', 1),
 ('kao_chuan', 1),
 ('malatang', 1),
 ('middle_eastern', 1),
 ('pasta', 1),
 ('pie', 1),
 ('shanghai', 1),
 ('sichuan', 1),
 ('sichuan_food', 1),
 ('sichuan_hotpot', 1),
 ('singaporean', 1),
 ('singaporean_food', 1),
 ('spanish', 1),
 ('turkish', 1),
 ('xinjiang_meishi', 1),
 ('中餐,酒,饮料', 1),
 ('粥,点心,清淡菜品', 1),
 ('蓝山咖啡', 1),
 ('蛋糕', 1),
 ('饺子 (jiaozi)', 1)]
In [439]:
c.execute('select * from nodes_tags where value like "%大使馆"').fetchall()
Out[439]:
[(1695852452, 'name', 'Singapore 大使馆', 'regular'),
 (1695870625, 'name', 'Vietnam 大使馆', 'regular'),
 (2692331349, 'name', 'Royal Norwegian 大使馆', 'regular')]
In [440]:
c.execute('select user,count(*) as num from nodes group by user order by num desc').fetchall()
Out[440]:
[('Chen Jia', 172392),
 ('R438', 126663),
 ('hanchao', 56687),
 ('ij_', 49985),
 ('katpatuka', 22670),
 ('m17design', 20199),
 ('Esperanza36', 16550),
 ('nuklearerWintersturm', 14295),
 ('RationalTangle', 12004),
 ('Алекс Мок', 9234),
 ('u_kubota', 8212),
 ('Popolon', 7417),
 ('FreedSky', 6953),
 ('Oberaffe', 6827),
 ('OSM-Bremen', 6732),
 ('Charlie_Tsai', 6562),
 ('42429', 6421),
 ('jamesks', 6414),
 ('liyingben', 6203),
 ('Insight Adventures', 6176),
 ('zhongguo', 5928),
 ('mousedou', 5743),
 ('4rch', 5198),
 ('BeijingHiking', 4821),
 ('MrBoot', 4819),
 ('ik999', 4683),
 ('三二一', 4473),
 ('Kartografiertier', 4403),
 ('_kendell', 4371),
 ('trekki', 4310),
 ('greecemapper', 3975),
 ('Lackness Franc', 3788),
 ('XBear', 3527),
 ('快乐书香虎', 3354),
 ('Helmchen42', 3260),
 ('adirricor', 3056),
 ('4b696d', 2975),
 ('Si-', 2959),
 ('ediyes', 2927),
 ('gerg1', 2849),
 ('Jonathan ZHAO', 2732),
 ('JasonFriedt', 2668),
 ('rza31', 2610),
 ('埃迪卡拉', 2386),
 ('7thgrade', 2332),
 ('lsq278866125', 2120),
 ('hulagirl14', 2083),
 ('thu-mapper', 2024),
 ('ClausHansen', 1988),
 ('olvagor', 1956),
 ('bigtigerlu', 1937),
 ('jwsgchk', 1817),
 ('MrCong', 1784),
 ('Jole22', 1556),
 ('NotInNebraska', 1522),
 ('luiswoo', 1418),
 ('DAJIBA', 1380),
 ('aighes', 1367),
 ('AndreR', 1355),
 ('轩轾CN', 1337),
 ('Hermann001', 1307),
 ('Chris Parker', 1298),
 ('GanDhi', 1245),
 ('trolleway', 1242),
 ('zhengnercv', 1234),
 ('Say-no', 1197),
 ('richlv', 1180),
 ('xcheny', 1134),
 ('Yan Li', 1116),
 ('tymmmy', 1108),
 ('krispyduck', 1097),
 ('edgar_bcn', 1027),
 ('ff5722', 1009),
 ('Sunng', 961),
 ('duquennc', 892),
 ('CQET', 885),
 ('sjhbcc', 848),
 ('chinoook', 809),
 ('8K-096', 806),
 ('duxxa', 805),
 ('nodje', 802),
 ('Daniel Bovensiepen', 786),
 ('Fangy', 785),
 ('thibautRe', 778),
 ('jack yao', 742),
 ('Павел Гетманцев', 732),
 ('m77', 729),
 ('Luis36995', 724),
 ('breathlesssss', 724),
 ('wikihero', 675),
 ('Xinyu', 672),
 ('Orichalcum', 661),
 ('+_+', 650),
 ('大笨熊', 639),
 ('ez_duce', 632),
 ('KIM57', 615),
 ('Dmitry2013', 598),
 ('liangent', 583),
 ('topstone', 581),
 ('TJRG', 572),
 ('wangchun', 561),
 ('MatzeR', 559),
 ('Vencej', 557),
 ('jamjpan', 555),
 ('SomeoneElse_Revert', 554),
 ('eric22', 541),
 ('regedy', 499),
 ('Liberion', 498),
 ('pnorman', 457),
 ('tonybuaa', 456),
 ('动感地带', 440),
 ('bass', 435),
 ('Manchito', 430),
 ('afetser', 427),
 ('卫冕1', 427),
 ('_rockmachine', 421),
 ('shiqiang', 421),
 ('GeGe', 412),
 ('Tong Hui', 395),
 ('dieterdreist', 395),
 ('jaimemd', 388),
 ('pieleric', 388),
 ('cutemaps', 382),
 ('KindredCoda', 377),
 ('Tooolder', 377),
 ('lumanz', 372),
 ('tartanabroad', 372),
 ('guoxiao', 371),
 ('Minjun', 366),
 ('haoyun', 362),
 ('jacobguo', 353),
 ('Antiver', 352),
 ('Cicerone', 351),
 ('Squirrel1982', 347),
 ('jedy001', 346),
 ('kartograf', 345),
 ('andrewpmk', 342),
 ('DaveLakowski', 338),
 ('Wmaria', 332),
 ('bingmapperde', 331),
 ('AtonX', 326),
 ('geltmar', 325),
 ('kisaa', 320),
 ('Fahni', 314),
 ('333de47320', 313),
 ('slariamou', 307),
 ('Daichizu', 306),
 ('wdmanuel', 302),
 ('meihou', 290),
 ('splinzer', 289),
 ('nihao28', 287),
 ('chaiko', 280),
 ('gudao', 280),
 ('JerryQ', 278),
 ('tlpinney', 272),
 ('Tilden', 271),
 ('dannykath', 267),
 ('Plair', 265),
 ('Arthur2e5', 256),
 ('WingedStone', 251),
 ('Wisco87', 246),
 ('sceic', 246),
 ('pfr', 244),
 ('RuosenLee', 240),
 ('mike_hd', 238),
 ('MrX_FF', 237),
 ('irasesu', 237),
 ('mlpnko2025', 236),
 ('yangke', 222),
 ('Kun Tan', 221),
 ('Quelbs', 221),
 ('ulfhe', 213),
 ('Rex_T', 210),
 ('samely', 210),
 ('Komяpa', 207),
 ('Supaplex', 207),
 ('0123', 197),
 ('funix', 195),
 ('kopiersperre', 195),
 ('skyship', 193),
 ('Deng Hwang', 188),
 ('antecessor', 188),
 ('Tznischd', 179),
 ('dbaron', 178),
 ('georhoko', 177),
 ('royboymaps', 176),
 ('michael_muenchen', 173),
 ('hummerking', 171),
 ('SimpleLuke', 168),
 ('mantj', 165),
 ('Speedy55', 163),
 ('girlinabox', 161),
 ('karitotp', 159),
 ('Janjko', 153),
 ('Andrey Maleev', 152),
 ('随风-125', 152),
 ('xtianetkti', 151),
 ('Jiateng Xu', 150),
 ('datpeter', 148),
 ('happysww', 148),
 ('jia199474', 146),
 ('KartaBY', 145),
 ('marek kleciak', 145),
 ('robocor', 145),
 ('teesterin', 145),
 ('Paul Bird', 144),
 ('DougPeterson', 139),
 ('calfarome', 139),
 ('Christoferr', 138),
 ('tedison', 138),
 ('uk1967', 138),
 ('DropFan', 137),
 ('Saturn', 137),
 ('fengerzh', 137),
 ('snodnipper', 137),
 ('srividya_c', 135),
 ('don-vip', 131),
 ('iamwh', 131),
 ('yanming', 131),
 ('Frank Gu', 130),
 ('antosheng', 130),
 ('第100次谎言', 129),
 ('Airmondon', 128),
 ('Whitelion808', 125),
 ('AqrCap', 124),
 ('Xuanyu', 123),
 ('gmlihao3', 123),
 ('RichRico', 122),
 ('美美Anna', 122),
 ('Poeloq', 121),
 ('四国军棋军长', 120),
 ('ethelmermaid', 118),
 ('tinaliao', 118),
 ('五星红旗', 118),
 ('daviddengcn', 117),
 ('Akushin', 115),
 ('Ray Ellis', 115),
 ('Vincent_Yangcheng', 115),
 ('ZoeG', 113),
 ('yummal', 113),
 ('La Chaussiére', 112),
 ('Yilin-vivi', 110),
 ('Interactiondesigner', 108),
 ('风青羊', 108),
 ('串串香', 107),
 ('OSMF Redaction Account', 106),
 ('Sunny', 106),
 ('young_ken', 106),
 ('Kostik', 104),
 ('dwandw', 104),
 ('Wiemann', 102),
 ('kid5', 102),
 ('sherrywang', 101),
 ('yepwu', 101),
 ('Chingping Yu', 100),
 ('aJIeks', 99),
 ('michal_m2001', 99),
 ('sebastic', 98),
 ('pzg417', 97),
 ('蔡小贫', 95),
 ('SuperMA', 94),
 ('sinopitt', 94),
 ('bowfinger26', 91),
 ('smont28', 91),
 ('AUV', 90),
 ('Shen Shi', 89),
 ('qianxinlin', 89),
 ('bjdayutong', 88),
 ('Holly1', 87),
 ('Vulcanodong', 87),
 ('watschel', 87),
 ('河中一螃蟹', 87),
 ('farendt', 86),
 ('user_5359', 86),
 ('yuanyelele', 86),
 ('Frankenwaldläufer', 85),
 ('Lansey', 85),
 ('andygol', 85),
 ('wnereiz', 85),
 ('JRA2', 84),
 ('Theodin', 84),
 ('allodailly', 84),
 ('celadevra', 84),
 ('tsangkenneth', 83),
 ('muaum', 82),
 ('绿野磨坊', 82),
 ('Vladimir Danilov', 80),
 ('aude', 80),
 ('congeal', 80),
 ('O-Reety', 78),
 ('bahnpirat', 78),
 ('yzm', 78),
 ('jengelh', 77),
 ('tulips', 76),
 ('早上不起', 76),
 ('abel801', 74),
 ('Couridecs', 73),
 ('norky', 73),
 ('VachelWong', 72),
 ('VarvaraKr', 72),
 ('astrowendy', 71),
 ('FerdieFF', 70),
 ('Kaiqiang', 69),
 ('Kevin Lo', 69),
 ('neilcperks', 68),
 ('Mathiason', 67),
 ('Proximus Locati', 67),
 ('bigalxyz123', 67),
 ('jaredc', 66),
 ('等待中的戈多', 66),
 ('tosuba', 65),
 ('Rub21', 64),
 ('Tcharvasky', 64),
 ('chen jack', 64),
 ('feihei', 64),
 ('zios', 64),
 ('Ninki', 63),
 ('DXLi', 62),
 ('baudav', 62),
 ('jywang6', 62),
 ('thbz', 62),
 ('Fantasy', 61),
 ('yuchengxi', 61),
 ('大颗粒番石榴', 61),
 ('Brait', 60),
 ('Qi Linzhi', 60),
 ('caoyuangis', 60),
 ('dragonzoebai', 60),
 ('Roger Zurawicki', 59),
 ('ballypc', 59),
 ('duye', 59),
 ('foxyflash', 59),
 ('isoscelesrectangle', 58),
 ('meadowair', 58),
 ('mapworld2008', 57),
 ('ThRiedel', 56),
 ('Tooler', 56),
 ('j_c_schwartz', 56),
 ('モンモン', 56),
 ('Jue37788', 55),
 ('Ping_Chen', 55),
 ('czhunty', 55),
 ('wmr89502270', 55),
 ('Hobart', 54),
 ('tonychiao', 54),
 ('yuguoba', 54),
 ('C142857', 53),
 ('M!dgard', 53),
 ('Vintagejhan', 53),
 ('Yafeng Shan', 53),
 ('pc高手', 53),
 ('skyship2011', 53),
 ('DuranZ', 52),
 ('MrB-cn', 52),
 ('Nasir Khan Saikat', 52),
 ('Stefan-China', 52),
 ('xorx', 52),
 ('老博博', 52),
 ('erjiang', 51),
 ('vvxvv', 51),
 ('flentz', 50),
 ('hummer617', 50),
 ('zxlsubway', 50),
 ('赖木易', 50),
 ('GeoLeslie', 49),
 ('WernerBeckmann', 49),
 ('botdidier2020', 49),
 ('mdk', 48),
 ('Drexl', 47),
 ('apollo6', 47),
 ('latterend', 47),
 ('nealmibe', 47),
 ('persmule', 47),
 ('beweta', 46),
 ('hegxiten', 46),
 ('intro727', 46),
 ('qianqian-Ge', 46),
 ('shawlee', 46),
 ('supernova2012', 46),
 ('wilkieliu', 46),
 ('Julien Nguyen', 45),
 ('happy_lixiaoli', 45),
 ('Eric Abrahamsen', 44),
 ('v2_false', 44),
 ('小象爱地图', 44),
 ('gsapijaszko', 43),
 ('hal9000plus', 43),
 ('lesko987', 43),
 ('snowyowls', 43),
 ('moai', 42),
 ('valavanisalex', 42),
 ('zq19831230', 42),
 ('Lily_Zhang', 41),
 ('chinamapper', 41),
 ('wanderlustig', 41),
 ('清风拂心', 41),
 ('Bing W', 40),
 ('Boyuan Yang', 40),
 ('CRVV', 40),
 ('carl1872', 40),
 ('sparkle530', 40),
 ('toplchx', 40),
 ('瓜子仁', 40),
 ('Nathan Gao', 39),
 ('SpeedoGoo', 39),
 ('miurahr', 39),
 ('wbl201212', 39),
 ('lingshuo', 38),
 ('pedrobv', 38),
 ('MintCondition', 37),
 ('Yaw&Roll', 37),
 ('ricky_x181', 37),
 ('washingtonxr', 37),
 ('xof', 37),
 ('万俟璇玑', 37),
 ('梦恬惜雨', 37),
 ('msdess', 36),
 ('wangying', 36),
 ('elfc2000', 35),
 ('nickcheng', 35),
 ('xiaolan', 35),
 ('Ramzes', 34),
 ('dark909', 34),
 ('pizikuan', 34),
 ('landgazer', 33),
 ('小林林', 33),
 ('祥子酷酷', 33),
 ('CCRwdew', 32),
 ('Van Chee Photography', 32),
 ('cxniub', 32),
 ('razor74', 32),
 ('北极熊', 32),
 ('DJ Yang', 31),
 ('Shiwei Yin', 31),
 ('bluerain', 31),
 ('kfxw', 31),
 ('netdragon', 31),
 ('zxy778', 31),
 ('豪迈-沐浴听风观日月,拈花卧草戏鱼虫', 31),
 ('AnthonyW', 30),
 ('Geang', 30),
 ('Qshen', 30),
 ('coralwangzhi', 30),
 ('issmall', 30),
 ('paul_127', 30),
 ('sw897', 30),
 ('wenzhi liu', 30),
 ('吕吕xingjun', 30),
 ('山水游客2008', 30),
 ('邹广峰', 30),
 ('EdAllen', 29),
 ('U20', 29),
 ('henry zhang gre', 29),
 ('ymango', 29),
 ('APOODDR', 28),
 ('Ecmpc', 28),
 ('Jerryshao', 28),
 ('TooM', 28),
 ('VesaMJN', 28),
 ('West Lake', 28),
 ('kwokym', 28),
 ('uriel80', 28),
 ('zlive', 28),
 ('Ciprol', 27),
 ('Ecthelias', 27),
 ('MissTardis', 27),
 ('寻找山顶洞', 27),
 ('ManuelMM', 26),
 ('lu_cid', 26),
 ('mal097', 26),
 ('tangzhengliang', 26),
 ('0831', 25),
 ('FRDian', 25),
 ('OS_001', 25),
 ('Ohr', 25),
 ('PlaneMad', 25),
 ('Samli', 25),
 ('chihchun', 25),
 ('linefeed', 25),
 ('mabo', 25),
 ('renliv', 25),
 ('weiier', 25),
 ('探索者', 25),
 ('观海听松阁掌柜的', 25),
 ('Tasteratan', 24),
 ('Zjy2012', 24),
 ('dsokolove', 24),
 ('taniarch', 24),
 ('Atticbee', 23),
 ('Erik Lundin', 23),
 ('LordOfMaps', 23),
 ('Yannick THLIET', 23),
 ('Yongxin Wang', 23),
 ('adou', 23),
 ('hafhaf', 23),
 ('kavin', 23),
 ('pascal2002', 23),
 ('paulzhang', 23),
 ('rkuris', 23),
 ('sunlongxiang', 23),
 ('winter_鸿鹄', 23),
 ('Fernando Alvarez', 22),
 ('Glodon_LBS', 22),
 ('Hongxiao', 22),
 ('Larryzh', 22),
 ('imsteen', 22),
 ('jman215', 22),
 ('xiaolinxiang3', 22),
 ('xiaoshan78', 22),
 ('Archjing', 21),
 ('Iguana_masch', 21),
 ('Josetheexplorer', 21),
 ('Shirley Tang', 21),
 ('Vachel_YY', 21),
 ('Yuanchu Si', 21),
 ('dingzhaogeng', 21),
 ('jensinbeijing', 21),
 ('woodpeck_repair', 21),
 ('陆人甲', 21),
 ('BoyuZhang', 20),
 ('CarlGuo', 20),
 ('feichashao', 20),
 ('holynova', 20),
 ('liushuyu', 20),
 ('lyksdu', 20),
 ('yuanshibuluo', 20),
 ('BiIbo', 19),
 ('eumiro', 19),
 ('feagle', 19),
 ('h = 1-1', 19),
 ('iclio', 19),
 ('lucaslu', 19),
 ('nuds', 19),
 ('ouleyang', 19),
 ('tianyinlee', 19),
 ('zErgA26', 19),
 ('飞雪一号', 19),
 ('Alexis BELLUET', 18),
 ('Bryanibit', 18),
 ('FuRao1990', 18),
 ('G_Nikon', 18),
 ('Liu Xu', 18),
 ('ahab003', 18),
 ('andersonchen', 18),
 ('djmaximu$', 18),
 ('gislhy', 18),
 ('hjkhjkhjkhjk', 18),
 ('jack1017', 18),
 ('sdfsdfsdfsdfsdf', 18),
 ('虞海YH', 18),
 ('JDub', 17),
 ('Justin Wong', 17),
 ('asdfl', 17),
 ('goyoung', 17),
 ('invartrango', 17),
 ('microcool', 17),
 ('mikewilliamson', 17),
 ('shravan91', 17),
 ('sinysh', 17),
 ('sunyss', 17),
 ('youkisakura', 17),
 ('Macheal', 16),
 ('RTH16', 16),
 ('chenchen', 16),
 ('striderxy', 16),
 ('zhaokunkun', 16),
 ('中華民國', 16),
 ('宇宙尘埃', 16),
 ('Alexlmc', 15),
 ('Bootingman', 15),
 ('Davvan', 15),
 ('MartinRice', 15),
 ('Rovastar', 15),
 ('SPTH', 15),
 ('fanglank', 15),
 ('fighterjordan', 15),
 ('fubupc', 15),
 ('giswei', 15),
 ('iandees', 15),
 ('lurlrlrl', 15),
 ('orion', 15),
 ('sunny001', 15),
 ('蒋琦琦', 15),
 ('Alard', 14),
 ('Bernhard Schoof', 14),
 ('ChallageZ', 14),
 ('Dingyuan Wang', 14),
 ('EtnaJason', 14),
 ('Kristyna', 14),
 ('Rellec', 14),
 ('doodilin', 14),
 ('han4n', 14),
 ('invada', 14),
 ('jcsjcs', 14),
 ('ljnio', 14),
 ('miklas', 14),
 ('shengt', 14),
 ('wangdan', 14),
 ('春518', 14),
 ('本因坊', 14),
 ('自由分享', 14),
 ('非常厉害', 14),
 ('AIRF', 13),
 ('Nulmer', 13),
 ('Rps333', 13),
 ('TonyMa', 13),
 ('Vencenton', 13),
 ('jingsam', 13),
 ('liyan19832009', 13),
 ('manoharuss', 13),
 ('martin0203', 13),
 ('pcaober', 13),
 ('semicircle21', 13),
 ('yuchao123', 13),
 ('修缘bit', 13),
 ('-vive', 12),
 ('Amandine Toussaint', 12),
 ('David Young Yu', 12),
 ('DennisL', 12),
 ('Feegle', 12),
 ('Feng Zhaolin', 12),
 ('Leonard_wone', 12),
 ('Magnus Bäck', 12),
 ('MikeGost', 12),
 ('Minh Nguyen', 12),
 ('Shenhemu', 12),
 ('Wzz5097', 12),
 ('ac201', 12),
 ('docsam', 12),
 ('donsmith', 12),
 ('fjbehr', 12),
 ('gray2', 12),
 ('jkaminsk1979', 12),
 ('jwt8070', 12),
 ('keeptalk', 12),
 ('liqi', 12),
 ('liuye', 12),
 ('mrpacmanmap', 12),
 ('murongmap', 12),
 ('oscar_ruan', 12),
 ('pjrobertson', 12),
 ('ridixcr', 12),
 ('sessaenglund', 12),
 ('shifeng', 12),
 ('songyiwuyue', 12),
 ('szdn', 12),
 ('喵星人小鱼', 12),
 ('壬申上元', 12),
 ('豆筋儿', 12),
 ('AMing Lau', 11),
 ('Andoon', 11),
 ('Dirk Gently', 11),
 ('MrCharmingSun', 11),
 ('ProjectThis', 11),
 ('Wei_map', 11),
 ('Wenpeng X', 11),
 ('William Young', 11),
 ('Zhang Feng', 11),
 ('aabin', 11),
 ('catmanhairy', 11),
 ('cclever', 11),
 ('fangbo', 11),
 ('heihei222', 11),
 ('jasonwang', 11),
 ('kurlez', 11),
 ('liang66', 11),
 ('mardepekani', 11),
 ('netpower', 11),
 ('qiangliu', 11),
 ('roofroof', 11),
 ('sarike', 11),
 ('simon@thehutong', 11),
 ('sisiliu1204', 11),
 ('sosie', 11),
 ('vivi_ray', 11),
 ('郭磊de', 11),
 ('Juicy Wang', 10),
 ('KX675', 10),
 ('Kai Fan', 10),
 ('MA_Mapper', 10),
 ('Roeschter', 10),
 ('Schoos', 10),
 ('Seong Soo Lee', 10),
 ('and_y3', 10),
 ('chinhsuen', 10),
 ('finlandhuang', 10),
 ('herozhang', 10),
 ('issac', 10),
 ('jiero', 10),
 ('lee k', 10),
 ('volare20', 10),
 ('wangzhiyu', 10),
 ('weigang0303', 10),
 ('xxx12x', 10),
 ('zszc', 10),
 ('刚果金', 10),
 ('如果不', 10),
 ('枫舞天痕', 10),
 ('王小蒙', 10),
 ('Christophe9791', 9),
 ('Dr Kludge', 9),
 ('Edmund Yan', 9),
 ('Fam Zheng', 9),
 ('FeipengRan', 9),
 ('Hilton Worldwide', 9),
 ('LeTopographeFou', 9),
 ('Nodes&Roads', 9),
 ('Solidworks', 9),
 ('XuXiang', 9),
 ('Yuying Cathy Ren', 9),
 ('imadbox', 9),
 ('longhan', 9),
 ('raynorli', 9),
 ('ruthmaben', 9),
 ('soeffing', 9),
 ('tigertaolin', 9),
 ('tippfeler', 9),
 ('yizhiking', 9),
 ('yuchangfu', 9),
 ('楠哥V5', 9),
 ('高空雁', 9),
 ('15Tr', 8),
 ('2bugs', 8),
 ('Anthony Li', 8),
 ('Carey1231', 8),
 ('KevanV', 8),
 ('L-Hedgehog', 8),
 ('Mikolaj Boc', 8),
 ('Parabonaut', 8),
 ('Phirov', 8),
 ('Sorry_Kevin', 8),
 ('Supaiku', 8),
 ('UglyTim', 8),
 ('YatingChen1028', 8),
 ('blue bay', 8),
 ('blumx3', 8),
 ('elgooG', 8),
 ('felipeedwards', 8),
 ('fujiazhiyu', 8),
 ('hanjiafu', 8),
 ('jcnegron', 8),
 ('jharpster', 8),
 ('junma', 8),
 ('leezju11', 8),
 ('leod10', 8),
 ('ma1009', 8),
 ('mokk', 8),
 ('notlqs', 8),
 ('qianying0001', 8),
 ('romero12345', 8),
 ('songbo', 8),
 ('sprhawk', 8),
 ('ulrich-dtmd', 8),
 ('wandsecacher', 8),
 ('zhang411421', 8),
 ('zhangang zhang', 8),
 ('zhongnan', 8),
 ('夜间带刀', 8),
 ('大奋团子', 8),
 ('山水游客', 8),
 ('未及小满', 8),
 ('漫步青春', 8),
 ('老城成', 8),
 ('0815andi', 7),
 ('AmelieLin', 7),
 ('Coco Andson', 7),
 ('David L Lecompte', 7),
 ('Depsy', 7),
 ('Flier Lu', 7),
 ('GAODE', 7),
 ('Jary', 7),
 ('MaoYu', 7),
 ('Monica Wu', 7),
 ('RGBCGY', 7),
 ('Snuffcn', 7),
 ('Thomas Schwiertz', 7),
 ('Ulmon Community', 7),
 ('Viktoria Khalanskaia', 7),
 ('ZERRIA', 7),
 ('cauzwh', 7),
 ('chenpeng', 7),
 ('dagui2005', 7),
 ('ecatmur', 7),
 ('gap496', 7),
 ('guokf', 7),
 ('hsadu', 7),
 ('kcrazy', 7),
 ('leoshin', 7),
 ('liujien', 7),
 ('liuwenmao', 7),
 ('maptheworld123', 7),
 ('tting', 7),
 ('ux backpacker', 7),
 ('visen', 7),
 ('wheelmap_visitor', 7),
 ('xybot', 7),
 ('yeus', 7),
 ('林明月香', 7),
 ('罗祥勇', 7),
 ('薛晓丹', 7),
 ('钝钝的osm', 7),
 ('Adrien93', 6),
 ('Arislide', 6),
 ('Dymsha', 6),
 ('EvgeniyaIva', 6),
 ('Gilnei', 6),
 ('HooVan', 6),
 ('Luis36995_labuildings', 6),
 ('Macy0816', 6),
 ('Mathbau', 6),
 ('Max Zhang', 6),
 ('O Lee', 6),
 ('Onorr', 6),
 ('PeetTheEngineer', 6),
 ('Peng Ren', 6),
 ('RanLei', 6),
 ('RobertFang', 6),
 ('Yu Song', 6),
 ('Zihua WANG', 6),
 ('amyhuang', 6),
 ('bruhnstv', 6),
 ('carfan', 6),
 ('gynix', 6),
 ('huangyg', 6),
 ('jkjkjk', 6),
 ('johanemilsson', 6),
 ('lihaitao', 6),
 ('liuliubaba', 6),
 ('luosun', 6),
 ('mailhelper', 6),
 ('maizidi', 6),
 ('minge', 6),
 ('minutos', 6),
 ('ninjach', 6),
 ('nortan', 6),
 ('shadowdragons', 6),
 ('shangyisun', 6),
 ('sijiu', 6),
 ('teddybear0807!!', 6),
 ('tintinlotus', 6),
 ('venusidp', 6),
 ('xiaopang', 6),
 ('yoyos', 6),
 ('zhangxlabab', 6),
 ('图图地图vip', 6),
 ('大头雨', 6),
 ('小雪儿', 6),
 ('聚焦二十人', 6),
 ('ALEXXIANG', 5),
 ('Alfred Meng', 5),
 ('BH1MCB', 5),
 ('Benoit Julhan', 5),
 ('Clarinet', 5),
 ('JoshHD', 5),
 ('LPFLPF', 5),
 ('Lilm', 5),
 ('MsPillow', 5),
 ('Narumol Suparat ahpa', 5),
 ('New6325', 5),
 ('SmileyWin', 5),
 ('Zhenghui Xiong', 5),
 ('adamzhang100', 5),
 ('alusiani', 5),
 ('alxzw', 5),
 ('bjzhanghao', 5),
 ('cbnowhere', 5),
 ('heha', 5),
 ('herrkaefer', 5),
 ('heyhawkey', 5),
 ('kekulik', 5),
 ('kindai', 5),
 ('leonhu', 5),
 ('le\u2006o', 5),
 ('lf464770730', 5),
 ('luge', 5),
 ('munkhbat', 5),
 ('myp-may', 5),
 ('mzr1987', 5),
 ('nanshanxiadedou', 5),
 ('pdslipanpan', 5),
 ('qiangliu_lq', 5),
 ('qiuming', 5),
 ('roger_w', 5),
 ('route4uuser', 5),
 ('runze', 5),
 ('schrobot21', 5),
 ('sirphilliptubell', 5),
 ('w176177082', 5),
 ('wensley', 5),
 ('wlove', 5),
 ('xcfrank', 5),
 ('xiaorenge', 5),
 ('xizi', 5),
 ('zhengmiao', 5),
 ('周中豪', 5),
 ('巩鹏军', 5),
 ('桨桨0314', 5),
 ('瑞Rui', 5),
 ('54306185', 4),
 ('AiGeek', 4),
 ('BrowserSnake', 4),
 ('Cornelius Neumann', 4),
 ('CrazyRabbit', 4),
 ('Daniel Lugilde', 4),
 ('DibelDragon', 4),
 ('Display Name 44', 4),
 ('Ervingzj 朱军', 4),
 ('Feng Jin', 4),
 ('Frank Ray', 4),
 ('GabrielPage', 4),
 ('GeoCrazy', 4),
 ('Geofreund1', 4),
 ('GerdP', 4),
 ('GourHu', 4),
 ('Gutsycat', 4),
 ('Iman Heydari', 4),
 ('KarlSW', 4),
 ('Kerstin76', 4),
 ('Michael W A', 4),
 ('Nicolenicole', 4),
 ('OxKing', 4),
 ('Pengzhan', 4),
 ('Petter Reinholdtsen', 4),
 ('Projekt-rolli', 4),
 ('SaraW', 4),
 ('Seok-gyu Yi', 4),
 ('Syl', 4),
 ('TheKnightWho', 4),
 ('Tony SUN', 4),
 ('Wang Xin', 4),
 ('Yussupov D', 4),
 ('Zhang Lili', 4),
 ('adjuva', 4),
 ('bengda', 4),
 ('coreytian', 4),
 ('cyiping', 4),
 ('dazhi', 4),
 ('dingyidanny', 4),
 ('djskl_00001', 4),
 ('empire009', 4),
 ('freak_antoni', 4),
 ('fxx2000', 4),
 ('ghatzhat', 4),
 ('hadw', 4),
 ('hfzhang99', 4),
 ('ife1988', 4),
 ('japa-fi', 4),
 ('jeanbaenvadrouille', 4),
 ('johndu', 4),
 ('laocuio', 4),
 ('leober', 4),
 ('liangsuny', 4),
 ('linkakai', 4),
 ('lkebin', 4),
 ('lks1[konto usunięte]', 4),
 ('mAcKeka', 4),
 ('mythria', 4),
 ('nebnat', 4),
 ('nikhilprabhakar', 4),
 ('nlw3025224', 4),
 ('nwamtf1', 4),
 ('pul', 4),
 ('recover_pp', 4),
 ('rosco_pc', 4),
 ('sRasmussen', 4),
 ('snow_sword_SZJ', 4),
 ('stouille84', 4),
 ('sundajian', 4),
 ('suze8793686', 4),
 ('sxt-vt', 4),
 ('tiger_yang', 4),
 ('vQY2yGmfeH74', 4),
 ('wangwei1121', 4),
 ('wenzhuang', 4),
 ('whgreate', 4),
 ('wuse', 4),
 ('xiaomaomao307', 4),
 ('xiaoming215', 4),
 ('yayima', 4),
 ('zcrwf', 4),
 ('zhangzhixian', 4),
 ('zhankai', 4),
 ('zhenbing', 4),
 ('zheng7fu2', 4),
 ('zhurenjie', 4),
 ('ziguang', 4),
 ('zixuan', 4),
 ('南北大街东西走', 4),
 ('市川ゆり子', 4),
 ('幻氵殇', 4),
 ('忧郁王子', 4),
 ('文彰君', 4),
 ('朝气蓬勃', 4),
 ('木子七', 4),
 ('沉住气', 4),
 ('流水剑客', 4),
 ('豆包13', 4),
 ('803', 3),
 ('Adelene Cheong', 3),
 ('Alps_Xing', 3),
 ...]

blogroll

social