您的位置:首页 > 运维架构

OpenStreetMap 总结

2012-07-27 19:33 260 查看
最近一段时间都在弄有关openstreetmap的,新发布的ios6已经拥有了自带的地图了,也就是说,googlemap在新的ios中将不再存在,而ios6自带的地图也就是openstreetmap,下面就把这段时间我所做的东西跟大家分享一下吧

一、OpenStreetMap简介

the project that creates and provides free geographic data and mapping to anyone who wants it. We started it because most maps you think of as free actually have legal or technical restrictions on their use, holding back people
from using them in creative, productive, or unexpected ways这就是Wiki给出的介绍,其实这些东西在google上随便一搜就有的,大致的概念了解一下就OK了,说白了就是一个免费地图

然后就是自己初用openstreetmap的感受了,openstreetmap现在还处于一个不成熟阶段,需要不断的完善,这个自己亲自用就知道了,有些细节方面的东西,openstreetmap还没有完善,一些很小的地方位置和名称什么的都没有标出来,只有一个大概的坐标位置和区域,不过,它有个编辑功能,用户可以自己在上面编辑地图,把没显示的地方的一些信息放到地图上面去,通过审核后,自己编辑的地方就会在openstreetmap上显示出来了

二、在ios原有的地图上实现OpenStreetMap的显示

不要以为这是跟导入百度地图一样的,openstreetmap没有那些类库什么的可以给你添加然后把framework直接加到工程里就可以调用了,新的ios6是有自己自带的地图,但其实里面的一些数据还是googlemap里的,只是换了openstreetmap的接口而已,在ios中显示openstreetmap,官网给出的方法是在原有的googlemap上添加图层,而添加的图层就是openstreetmap,即拿openstreetmap覆盖掉googlemap,但是左下角的GooGle标志还是存在的,这个是没办法消除的,所以,这个办法也只能是不是办法的办法,另外一个比较不好的地方就是,由于openstreetmap与googlemap有一定的差别,所以,所以覆盖上去的openstreetmap并不是和底下的googlemap在坐标位置上一一对应的覆盖上去的,当你在定位的时候就会发现,你的真实坐标和你在地图上的坐标位置差的很远

自己一开始还以为有什么方法可以直接用具体坐标在图层上定位的,自己在网上找了很久,把在官网下载的demo看了一遍又一遍,发现确实是没有这种方法,官网给出的demo就是直接跳过图层,用底下的googlemap来定位的

下面就来看一下怎么个加图层法

首先到http://wiki.openstreetmap.org/wiki/OSM_in_MapKit下载四个文件TileOverlay.h, TileOverlay.m,
TileOverlayView.h, TileOverlayView.m,我是直接把整个的demo下载下来,然后把这四个文件导出add到自己的工程里,这个四个文件可以说就是一幅openstreetmap地图了,你所要做的就是在你的mapView上添加这幅地图,这样,你的mapView上显示的就是openstreetmap了,这里要掌握的知识是MKMapView overlay的添加,其他的没什么技术要点了,看懂这四个文件真的是一件很不容易的事情,可能自己资质愚钝吧,这个文件是定义overlay的,在http://tile.openstreetmap.org/%@.png这个链接里加上一些数据就可以得到openstreetmap了,自己个人觉得弄懂这四个文件没多大的意思,也就没研究得太深入,因为毕竟以后接触到自定义地图图层的机会会很少,一些基本的函数,知道个大概就OK了

map.delegate=self;


这句代码是关键啊,这个东西可曾经困了几天啊,就是因为没加这句话导致一个函数没法自动调用,图层显示不了

TileOverlay *overlay=[[TileOverlay alloc]initOverlay];
[map addOverlay:overlay];


这是添加的图层的代码

另外还需要一个overlayView,overlay就是在这个View上显示,代码如下:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
//MKOverlayView *view=nil;
if([overlay isKindOfClass:[MKPolyline class]])
{
MKPolylineView *routelineView=[[MKPolylineView alloc]initWithOverlay:overlay];
routelineView.fillColor=[UIColor redColor];
routelineView.strokeColor=[UIColor redColor];
routelineView.lineWidth=5;
//return routelineView;
return  routelineView;
}
else {
TileOverlayView *overlayView=[[TileOverlayView alloc]initWithOverlay:overlay];
overlayView.alpha=1.0;
return overlayView;
}
}
这里有两个overlayView,解释一下,因为我是将openstreetmap运用到自己之前写的微博中去的,在openstreetmap上显示自己好友最近的位置动态,然后画线连接起来的,画线也需要一个overaly,所以这里有两个overlayView,要进行判断,如果是画线的就定义画线的overlayView,如果是图层的就定义TileOverlayView

运行之后有如下效果:



这是openstreetmap的图层,以这样的缩放比例来看的话,位置准确性方面是没有问题的,但是当放大到最大倍数的时候,就比较明显了,一些具体的位置,上面什么标注都没有,数据其实是很不健全的,相比起googlemap来说,这些方面确实是不够好

这里再说一下画线的东西吧

MKPolyline * routeLine=[MKPolyline polylineWithCoordinates:coordinate count:count];
[map addOverlay:routeLine];


有两个画线的函数,一个是用CLLocationCoordinate2D,就是我用的这种,还有一个就是用MKMapPoint,因为用MKMapPoins是用coordinate转换而来的,所以我就直接有用coordinate的了,注意,要连的是一组点,所以要定义coordinate数组,利用微博的API拿到好友的位置动态,其实也是个取json数据的过程而已,这里就不重复说了

最后再说一下自己的感受和见解吧,其实一开始,老师叫我弄openstreetmap的时候是一个好的初衷的,上网查阅过openstreetmap资料的人就知道,openstreetmap将来是会成为主流的,它具有很大的发展前景,会慢慢地替代googlemap,尽管ios6是自带了属于自己的地图,但是其他平台像安卓,WP等就还是会继续沿用googlemap,所以,寻找一种在googlemap基础上显示openstreetmap的方法是可行的,不单单低版本的ios可以使用,其他的平台也能使用,其实自己最近一段时间都是在看有关地图的东西,既然ios6都有自带的地图了,那迟些应该会出现openstreetmap的一些包和类库之类的东西,这样,就可以直接导入包然后调用了,确实加图层并不是一个很好办法,最大的问题就是位置的准确性,用户就是为了知道的自己的确切位置而使用这个应用的,如果无法定位到确定的位置,那就很难被用户所接受了,这也将是个失败的应用,我会再继续关注openstreetmap的动向,看能不能找到更好的解决的办法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: