OpenStreetMap Data Case Study
---
地图区域
portland, TX, United States
https://www.openstreetmap.org/relation/127875
选择区域时遇到的问题
一开始选择了北京区域来进行项目,但到后面清洗数据的时候,遇到一个问题,但可考虑到python读取中文需要转码,学习此数据课程前完全没有接触过编程,因此还是选择了美国的城市,感觉会更容易些。之后有时间会尝试用mangoDB数据库研究北京区域的数据。
获得样本文件
从原始 OSM 区域中获取系统的元素样本,k越大,样本文件越小。
修正街道名称
使用正则表达式对发现的实际问题添加映射。
数据导入SQL后,一些基本查询显示街道名称缩写和expected中的街道类型不同。应依照expected纠正街道的名称,选择不使用正则表达式。
统一电话号码格式
def update_phone_num(phone_num):
m = phone_num_re.match(phone_num)
if m is None:
......
导出为csv文件
解析OSM XML文件中的元素,将这些元素从文档形式转换为表格形式,再写入 .csv 文件。
将csv文件导入数据库
这里我用DB browser for sqlite,把csv文件导入sql数据库。
数据概述和补充意见
文件大小
portland_oregon.osm ......... 1.62 G
P3.db .......... 939.6 MB
nodes.csv ............. 633.8 MB
nodes_tags.csv ........ 11.2 MB
ways.csv .............. 60.7 MB
ways_tags.csv ......... 157.6 MB
ways_nodes.cv ......... 186.4 MB
nodes的数量
QUERY = "SELECT COUNT(*) FROM nodes"
[(6756791,)]
ways的数量
QUERY = "SELECT COUNT(*) FROM ways"
[(876817,)]
独立用户数的数量
QUERY = "SELECT COUNT (DISTINCT(e.uid)) FROM (SELECT uid FROM nodes UNION ALL SELECT uid FROM ways)e;"
[(1491,)]
只出现一次的用户的数量
QUERY = "SELECT COUNT(*) FROM (SELECT e.user, COUNT(*) as num FROM (SELECT user FROM nodes UNION ALL SELECT user FROM ways) e GROUP BY e.user HAVING num=1) u"
[(289,)]
贡献最大的10名用户
QUERY = "SELECT e.user,COUNT(*) as num FROM (SELECT user FROM nodes UNION ALL SELECT user FROM ways)e GROUP BY e.user ORDER BY num DESC LIMIT 10"
[(u'Peter Dobratz_pdxbuildings', 1949443), (u'lyzidiamond_imports', 1896180), (u'Mele Sax-Barnett', 559609), (u'baradam', 541141), (u'Darrell_pdxbuildings', 430582), (u'cowdog', 362994), (u'Peter Dobratz', 320534), (u'Grant Humphries', 295009), (u'justin_pdxbuildings', 116528), (u'amillar-osm-import', 106857)]
下面是一些用户贡献百分比统计信息:
1.顶级用户贡献率(“Peter Dobratz_pdxbuildings”)25.54%;
2.结合前2用户贡献(“Peter Dobratz_pdxbuildings”和“lyzidiamond_imports”)50.38%;
3.综合排名前10位的用户贡献86.18%;
4.只贡献一次的用户占总用户的19.38。
什么类型的商店最多(top10)
QUERY = "SELECT value,COUNT(*) as num FROM nodes_tags WHERE key='shop' GROUP BY value ORDER BY num DESC LIMIT 10"
[(u'convenience', 208), (u'hairdresser', 159), (u'clothes', 148), (u'beauty', 119), (u'car_repair', 70), (u'mobile_phone', 69), (u'supermarket', 48), (u'optician', 41), (u'bakery', 37), (u'hardware', 37)]
便利店最多,其次是发廊、服装店、美容院、汽车修理厂、手机店、大超市、眼镜店、面包店、五金店。结果还是符合预想的。
宗教信仰
QUERY = "SELECT nodes_tags.value,COUNT(*) as num FROM nodes_tags JOIN (SELECT DISTINCT(id) FROM nodes_tags WHERE value='place_of_worship') i ON nodes_tags.id=i.id WHERE nodes_tags.key='religion' GROUP BY nodes_tags.value ORDER BY num DESC"
[(u'christian', 553), (u'buddhist', 5), (u'jewish', 2), (u'muslim', 2), (u'unitarian_universalist', 2), (u'eckankar', 1), (u'hindu', 1), (u'sikh', 1)]
宗教是美国文化中非常显著的一部分,。美国绝大多数人信奉基督教,但其他各种宗教也同时并存。
十大最受欢迎的菜
QUERY = "SELECT nodes_tags.value,COUNT(*) as num FROM nodes_tags JOIN (SELECT DISTINCT(id) FROM nodes_tags WHERE value='restaurant')i ON nodes_tags.id=i.id WHERE nodes_tags.key='cuisine' GROUP BY nodes_tags.value ORDER BY num DESC LIMIT 10"
[(u'pizza', 66), (u'mexican', 49), (u'thai', 36), (u'american', 34), (u'chinese', 33), (u'italian', 16), (u'sushi', 16), (u'burger', 15), (u'japanese', 15), (u'asian', 13)]
看来,波特兰k人最喜欢吃披萨,中餐也有很好的市场。
建议:
建立反馈激励机制,鼓励用户提交新数据和更新旧数据
好处:
给用户反馈,能让更多的用户更多的给地图贡献数据,地图数据量得以保证;2.适当的激励机制,能增加数据的可靠性,旧数据及错误数据也能得到更新。
预期的问题:
新用户增多,前期不熟悉产品,可能会带来很多的错误数据和重复数据;2.可能会增加维护成本。