OpenStreetMap Data Case Study

 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.可能会增加维护成本。

你可能感兴趣的:(OpenStreetMap Data Case Study)