OpenStreetMap地图数据介绍(转)

原文链接:每日一读 Packtpub.OpenStreetMap(1)

相信绝大多数人都知道Wiki,但要提起地图,大家第一反应肯定是Google地图。在没看这本书之前,还真不知原来还有OpenStreetMap,一个类似于wiki的可供自由编辑的世界地图,它是由用户创造的,允许你查看,编辑或者使用世界各地的地理数据。

Making a Free, Editable Map of the World

简要介绍了OpenStreetMap的历史,从最初的Java到现在的Ruby on Rails.

Getting started at openstreetmap.org

从 http://www.openstreetmap.org/ 登进去后,可以看到两个定位搜索引擎:Nominatim 和Geonames。书中建议注册一个账户,那就建个呗。然后啰嗦的介绍了一通openstreetmap。

Gathering Data using GPS

顾名思义,用GPS来收集信息。苦于囊中羞涩,玩不起GPS,直接跳过了。但本章最后一小节还是照顾了我一下,Collecting information without a GPS。你收集不到数据,帮人家改改数据还是可以的。大体需要用到这么两个网站:

http://downloads.cloudmade.com/ http://walking-papers.org/。瞧过以后,发现自己还是做不了。人家要你打印出来,手动画上去。算了,咱没那绘画的天分。

How OpenStreetMap Records Geographical Features

OpenStreetMap 有自己的数据模型,跟普通的GIS数据模型还不一样。

OpenStreetMap‘s design goals 设计目标

1.越简单越好。

不由想起了自己的第一个项目,做一家矿产公司的资源管理系统,主要也是跟地图打交道。因为提前把自己的模块完成了,这时候自虐综合症又缠上了我。没事找事,非要跟风整个SSH进去。整完SSH后,又觉得论坛那块不够炫,鼓捣鼓捣,又把Fckeditor揉进去了。弄完后,得意洋洋,把代码一合。随后被老师揪过去问,怎么速度变这么慢了。。。。。 
2.带有维基风格的编辑功能。

3.能够记录拓扑结构。

4.给地图编辑者最大编辑自由,能够随心所欲标我所想。

The data structures used 数据结构

三种基本数据类型:nodes,ways 和 relations。

Nodes

节点就是空间中的点,数据类型中唯一用来标识位置信息的类型,其他两种都依赖于他。看看书上的例子吧:

<osm version="0.6" generator="OpenStreetMap server"> 
    <node id="483034256" lat="55.9458449" lon="-3.2035477" version="1" 
        changeset="2369219" user="spytfyre" uid="166957" visible="true" 
        timestamp="2009-09-04T13:35:42Z"> 
        <tag k="name" v="The Blue Blazer" /> 
        <tag k="amenity" v="pub" /> 
    </node> 
</osm>

每个节点都至少有经度和纬度两个属性。不由得又想起了我的第一个项目,想起了自己跟老师讨论要不要在Oracle数据库中加经纬度字段的岁月。为什么人总忘不了第一次,不管结果多么凄惨。。。

lat="55.9458449" lon="-3.2035477" latitude 纬度 longitude 经度

<tag k="amenity" v="pub" /> tag里的k,v属性,相信做Java的都可以猜得到,就是key,value。

Ways

“路”是什么?天下本没路,走的人多了就有了。天下本没有路,踩得“点”多了就有了。Ways就是一组排序好的Node。一条路至少得要两个节点。同样看个例子吧:

<osm version="0.6" generator="OpenStreetMap server"> 
    <way id="43157302" visible="true" timestamp="2009-10-26T10:45:09Z" 
        version="1" changeset="2954960" user="Ed Avis" uid="31257"> 
        <nd ref="540653724" /> 
        <nd ref="25507043" /> 
        <nd ref="107762" /> 
        <nd ref="25507038" /> 
        <nd ref="107759" /> 
        <tag k="highway" v="primary" /> 
        <tag k="lcn_ref" v="6a" /> 
        <tag k="name" v="Parliament Street" /> 
    </way> 
</osm>

看起来倒确实蛮简单的,至少比我的第一次那个简单,O(∩_∩)O~。ref 属性告知走的是哪个“点”,简单明了。

Relations

关系这东西挺复杂的。可以有节点,有路子,还有其他关系,乱乱的。总之就是一堆基本数据类型及其组合形成的东东。来看个关系:

<osm version="0.6" generator="OpenStreetMap server"> 
    <relation id="113421" visible="true" timestamp="2009-11-03T10:08:27Z" 
        version="2" changeset="3023369" user="Jonathan Bennett" uid="5352"> 
        <member type="node" ref="270186" role="via" /> 
        <member type="way" ref="4418767" role="from" /> 
        <member type="way" ref="4641665" role="to" /> 
        <tag k="restriction" v="no_right_turn" /> 
        <tag k="type" v="restriction" /> 
    </relation> 
</osm>

晕了吧,这家伙的意思是说,“不准右拐”。书上也说了,这是 OpenStreetMap 最不成熟的数据类型。

Changesets

除了三个基本数据类型外,还有Changesets这么一个小弟。顾名思义,就是用来表示变化的。

<osm version="0.6" generator="OpenStreetMap server"> 
    <changeset id="1787116" user="Jonathan Bennett" uid="5352" 
        created_at="2009-07-10T09:52:28Z" closed_at="2009-07-10T09:52:31Z" 
        open="false" min_lon="-4.4224237" min_lat="56.1382502" max_lon="-3.9613266" 
        max_lat="56.6330162"> 
        <tag k="created_by" v="JOSM" /> 
        <tag k="comment" v="Additions and edits to NCR7" /> 
    </changeset> 
</osm>

可以看到,变化的信息并没有体现在这里,你要到数据库里把对应的XML下下来才知道。描述和内容是分离的。

The tagging system

大家已经看到很多tag标签了,tag干嘛用的呢。tag 是一个键值对,用来告诉你真实世界的情况。一个Key当然只能有一个valuse,但我想要有多个怎么办呢。有办法,客管请看:

<osm version="0.6" generator="OpenStreetMap server"> 
    <node id="107775" lat="51.5072647" lon="-0.1278328" version="29" 
        changeset="2628959" user="EdinburghGael" uid="170586" visible="true" 
        timestamp="2009-09-25T23:04:28Z"> 
        <tag k="place" v="city" /> 
        <tag k="name:zh" v="伦敦" /> 
        <tag k="name:sv" v="London" /> 
        <tag k="name:sk" v="Londyn" /> 
        <tag k="name:ru" v="Лондон" /> 
        <tag k="name:fi" v="Lontoo" /> 
        <tag k="name:es" v="Londres" /> 
        <tag k="name:gv" v="Lunnin" /> 
        <tag k="name:zh_pyt" v="Lúndūn" /> 
        ... 
        <tag k="is_in" v="England, United Kingdom, UK, Great Britain,Europe" /> 
        <tag k="capital" v="yes" /> 
        <tag k="name:fr" v="Londres" /> 
        <tag k="name:cy" v="Llundain" /> 
    </node> 
</osm>

其实就是加前缀或者后缀啦,是不是有点像Java里的国际化。

“Any tags you like”

大意就是你可以随意应用tag,没有限制。其实就是可以自定义tag,告诉 OpenStreetMap 这个tag 的含义是什么,代表的什么意思。说是没有限制,其实还是有限制的,"Don‘t tag for the renderer"。就是不要动原来的描绘器。

这章最后列出了几个网址,介绍了核心tag和常用第三方工具:

http://wiki.openstreetmap.org/wiki/Map_Features http://osmdoc.com/en/tags/ http://tagwatch.stoecker.eu/

http://www.google.com/cse/home?cx=015487330990472192076:qvmeg3q9qus

看完这一章后,有点想我的第一个项目了。“呀哈,我是不是可以把他再完善完善(⊙o⊙)?”。。。。。。

时间: 2024-10-12 08:32:33

OpenStreetMap地图数据介绍(转)的相关文章

用java解析在OpenStreetMap上下载的地图数据

采用dom4j解析下载的xml文件,java程序如下: package gao.map.preprocess; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.I

利用QGIS下载地图数据

这段时间做了一些利用地理信息进行定位导航的系列工作,其中很重要的一部分是如何获取到地图数据,比如道路的矢量图.某一区域的栅格图,我用到的主要工具是QGIS.QGIS是一个跨平台的免费应用,其中集成了对矢量图.栅格图处理的很多功能,同时也集成了很多开放地图数据网站的接口,比如OpenStreetMap等,因此,在获取数据,并处理成我们需要的格式方面非常便利.本篇博文主要介绍如何使用QGIS下载数据,并处理成特定的格式. 一. 指定区域指定地物矢量图获取 我们经常会遇到这样一种需求:获取某一区域的指

[原]导入OpenStreetMap海图数据,并在GeoServer上发布

转载请注明作者think8848和出处(http://think8848.cnblogs.com) 上回我们说到如何<在GeoServer中为OpenStreetMap数据设置OSM样式>,文中本来是要发布海图的,因为时间太晚了,所以今天补上吧. 1. 下载OpenStreetMap海图数据 请打开这个网站下载http://openstreetmapdata.com/data/water-polygons OpenStreetMap海图数据(是否称为水图更好点:)) 这里面有三个文件,本文将用

4D数据介绍

转自青椒炒蛋:http://www.smallleafs.com/article/35.aspx 4D数据包括DLG(数字线画地图).DEM(数字高程模型).DOM(数字正射影像地图).DRG(数字栅格地图). DLG 数字线划地图(DLG, Digital Line Graphic):是与现有线划基本一致的各地图要素的矢量 数据集,且保存各要素间的空间关系和相关的属性信息.> 在世字测图中,最为常见的产品就是数字线划图,外业测绘最终成果一般就是DLG.该产品较全面地描述地表现象,目视效果与同比

SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据

转自:http://www.cnblogs.com/beniao/archive/2011/03/22/1989310.html 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的

SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案

原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的GIS专业理论知识. 5

Datazen地图Chart介绍

本篇主要介绍Datazen对于地图图表的支持,这里你可以看到Datazen目前所支持的地图图表类型,以及其自带的地图数据. Datazen下地图图表跟其它Dashboard的类型是一样的. 创建一个新的Dashboard. 可以看到三种地图图表类型,分别是两种热点图和一个气泡图. 首先看一下气泡图的样式,这类图表更适合表达区域的数量. 以及两类热点图,这类图表更适合表达热度数据,比如奔驰某类车在哪些地方更受欢迎等. 手机中的版本. Datazen的地图数据是shp格式的数据,对于传统,或者粒度要

使用R画地图数据

用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. 用R绘制地图比较简单.比如画一下全国范围的区域,可以用如下代码: library(maptools) mydat = readShapePoly("china-province-border-data.tar/china/bou2_4p.shp") #地图包位置,根据自己的角标位置设置

OpenLayers学习--加载指定等级指定范围的高德地图数据

在使用高德地图数据的时候,我们通常不需要加载世界地图,只需要指定项目片区地图数据即可:同样,我们也不需要所有等级的数据,只需要指定等级数据即可. 按照<OpenLayers学习--Layer体系(一)>中的方法,直接使用XYZ图层类来加载,显然无法实现该功能.主要原因有以下两点: 1.没有指定地图的分辨率 OpenLayers的机制就是,当你没有给Layer指定分辨率,也没有给Map指定分辨率,则直接将地图的最大范围的左上角点作为切图原点,并且按照18级来计算切图分辨率,分辨率是以1/2向下递