新普金娱乐网址


有人靠答题赚了4万多,还有那等好事?

地理知行合一的愿意家永不谢幕| 由袁庚的蛇口改良谈开去

iOS中手把手教你并线地图(干货,百度地图为例)

  • 二月 22, 2019
  • 地理
  • 没有评论

NoSQL数据库常常被当作很多非成效性的地点,如,扩大性,质量和一致性的地点。这几个NoSQL的表征在理论和实践中都正在被公众大规模地研究着,研商的看好正是那多少个和总体性分布式相关的非成效性的事物,大家都明白CAP
理论
被很好地动用于了NoSQL系统中(陈皓注:CAP即,一致性(Consistency),可用性(Availability),分区容忍性(Partition
tolerance),在分布式系统中,那多个成分最多只可以同时已毕四个,而NoSQL一般放任的是一致性)。但在一边,NoSQL的数量建模技术却因为不够像关系型数据库那样的基础理论没有被世人很好地钻探。那篇小说从数额建模方面对NoSQL家族举办了相比,并探究多少个大规模的多少建模技术。

举手投足地图,效果如下:

(7)索引表 Index Table

Index
Table索引表是三个不胜直接的技艺,其得以你在不援救索引的数据库中赢得索引的裨益。BigTable是那类最根本的数据库。那亟需大家保安2个有对应存取情势的尤其表。例如,大家有一个主表存着用户帐号,其可以被UserID存取。某询问需求查出有些城市里全数的用户,于是大家可以进入一张表,那张表用城市做主键,全数和这些城池有关的UserID是其Value,如下所示:

地理 1

Index Table Example

足见,城市索引表的急需和对主表用户表保持一致性,由此,主表的每2个创新大概必要对索引表进行更新,不然就是1个批处理更新。无论哪个格局,这都会加害一些性质,因为急需保证一致性。

Index Table索引表可以被认为是关系型数据库中的视图的等价物。

适用性:BigTable数据库。

1.集成地图环境
先去百度官方下载SDK,然后导入对应的公文到你的体系中,在那里杂乱的不说,提多少个地点:mapapi.bundle别忘了导入;
除了导入百度提供的包,还要手动在先后中添加系统库;
info.plist文件中多少个操作:iOS9后http协议的装置;获取地理地方的设置;display
name的设置; 最后一点,去百度申请的key要对应你项目中的buddle id
。xcode7.3中自行指示有时候挺令人无语的,不出来大家的结果,导入头文件的时候他唤醒的都畸形,今后把所以头文件写在底下,依据必要复制粘贴即可。

要起来谈论数量建模技术,大家不得不或多或少地先系统地看一下NoSQL数据模型的成人的大势,以此我们能够了有的他们内在的联络。下图是NoSQL家族的进化图,我们可以旁观那样的腾飞:Key-Value时期,BigTable时期,Document时期,全文检索时代,和Graph数据库时代:(陈皓注:注意图中SQL说的那句话,NoSQL再这么发展下去就是SQL了,哈哈。)

- (id)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
        self.centerOffset = CGPointMake(0, 0);
        //定义改标注总的大小
        self.frame = CGRectMake(0, 0, 39, 39);

        _bgImageView = [[UIImageView alloc] initWithFrame:self.frame];
         _bgImageView.image = [UIImage imageNamed:@"iconsend.png"];
        [self addSubview:_bgImageView];
    }
    return self;
}

率先,大家须求留意的是SQL和关系型数据模型已存在了不短的光阴,那种面向用户的自然性意味着:

接下来定位吧,地图上就显示出2个黄褐小点,然后您兴奋了吧,没等你欢悦多长期,产品跑来给您说,定位的图形大家须要用大家休戚相关规划的图样,傻了呢。接下来就须求用到自定义标注了。

在.m文件最上边,我们还要声美素佳儿(Friso)(Karicare)个PointAnnotation类,代码如下

NoSQL数据模型摘要

正文剩下的章节将向你介绍数据建模的技术完结和有关格局。可是,在介绍那些技能从前,先来一段序言:

  • NoSQL数据模型设计一般从业务使用的切实可行数额查询出手,而不是多少间的涉嫌:
  • 关系型的数据模型基本上是分析数据间的布局和关系。其设计意见是:
    What answers do I have?”
  • NoSQL数据模型基本上是从应用对数据的存取格局起始,如:小编需求协助某种数据查询。其设计理念是 ”What
    questions do I have?”
  • NoSQL数据模型设计比关系型数据库需求对数据结构和算法的更深的垂询。在那篇小说中小编会和豪门说那些明明的数据结构,那些数据结构并不只是被NoSQL使用,不过对于NoSQL的数据模型却极度有辅助。
  • 数码冗余和反规格化是一等国民。
  • 关系型数据库对于拍卖层级数据和图式数据十二分的不便于。NoSQL用来消除图式数据肯定是二个尤其好的缓解方案,大约拥有的NoSQL数据库可以很强地消除此类题材。那就是怎么那篇小说专门拿出一章来表达层级数据模型。

下边是NoSQL的分类表,也是自个儿用来写那篇作品时做执行的产品:

  • Key-Value 存储: Oracle Coherence, Redis, Kyoto Cabinet
  • 类BigTable存储: Apache HBase, Apache Cassandra
  • 文档数据库: MongoDB, CouchDB
  • 全文索引: Apache Lucene, Apache Solr
  • 图数据库: neo4j, FlockDB

并且,大家定义1本性质

  • Graph data models图式数据库 可以被认为是以此进化历程中从Ordered
    Key-Value数据库发展过来的四个分层。图式数据库允许构指出图结构的数据模型。它和文档数据库有关联的来头是,它的累累兑现允许value能够是三个map或是八个document。
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation {
//if ([annotation isKindOfClass:[BMKPointAnnotation class]]) //判断是哪个BMKPointAnnotation
       MyAnnotionView *newAnnotationView = (MyAnnotionView *)[mapView dequeueReusableAnnotationViewWithIdentifier:myLocationViewID];
        if (newAnnotationView == nil) {
            newAnnotationView = [[MyAnnotionView alloc] initWithAnnotation:annotation reuseIdentifier:myLocationViewID];
        }
        return newAnnotationView;
}

层级式模型Hierarchy Modeling Techniques

_mapView.centerCoordinate = userLocation.location.coordinate(如果直接写在代理方法中,需要在代理方法末尾调用[_locService stopUserLocationService] 方法,让定位停止,要不然一直定位,你的地图就一直锁定在一个位置)。

原文来自“NoSQL Data Modeling
Techniques
”,由酷壳网陈皓编译《NoSQL数据建模技术》。那篇文章看完今后,你大概会对NoSQL的数据结构会稍稍觉得。小编的感觉是,关系型数据库想把一致性,完整性,索引,CRUD都干好,NoSQL只干某一种事,可是捐躯了不少其余东西。总体来说,小编觉得NoSQL更符合做Cache。

本来了,想要动画的话,大家照旧这么设置:

(5)可枚举键Enumerable Keys

想必,对于无顺序的Key-Value最大的裨益是工作实体可以被简单地hash以分区在多少个服务器上。而排序了的key会把工作搞复杂,不过多少时候,1个运用能从排序key中取得众多益处,就终于数据库自身不提供那些功效。让我们来合计下email消息的数据模型:

  1. 一些NoSQL的数据库提供原子计数器以允许生一些三番五次的ID。在那种场地下,大家可以动用 userID_messageID 来做为一个结缘key。假诺我们知晓最新的message
    ID,就能够精通前贰个message,也或然知道再前面和后边的Message。
  2. Messages可以被装进。比如,每日的邮件包。那样,大家就可以对邮件按指定的年华段来遍历。

**适用性: **Key-Value Store键值对数据库

- (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode {
    if (errorCode == BMK_SEARCH_NO_ERROR) {
        for (int i = 0; i < poiResult.poiInfoList.count; i++) {
            BMKPoiInfo *info = [poiResult.poiInfoList objectAtIndex:i];
            NSLog(@"地址:%@", info.name);
        }
    }
}

NoSQL Data Models

Paste_Image.png

(4)原子聚合Atomic Aggregates

成百上千NoSQL的数据库(并不是全数)在事务处理上都以短板。在好几情状下,他们得以由此分布式锁技术可能应用层管理的MVCC技术来已毕其事务性(陈皓注:可参看本站的“多版本出现控制(MVCC)在分布式系统中的应用”)可是,日常来说只可以动用聚合Aggregates技术来担保一些ACID原则。

那就是怎么大家的关系型数据库要求有强有力的事务处理机制——因为关系型数据库的数据是被规格化存放在了不一样的地点。所以,Aggregates聚合允许我们把3个作业实体存成八个文档、存成一行,存成四个key-value,那样就足以原子式的换代了:

地理 2

Atomic Aggregates

理所当然,原子聚合Atomic
Aggregates那种数据模型并不可以完成完全意义上的事务处理,不过假诺帮忙原子性,锁,或test-and-set指令,那么,Atomic
Aggregates是可以适用的。

**适用性: **Key-Value Store键值对数据库,Document
Databases文档数据库,BigTable风格的数据库。

7.路径规划
将目标地和开首地方连接起来,通过百度内部API来报告大家怎么去(也等于去二个地点查地图一样)
第①导入<BaiduMapAPI_Search/BMKRouteSearch.h>
<BaiduMapAPI_Utils/BMKUtilsComponent.h>那五个头文件,并依照代理BMKRouteSearchDelegate。

(6)降维Dimensionality Reduction

Dimensionality
Reduction降维是一种技术可以允许把1个多维的数码映射成3个Key-Value或是此外非多给的数据模型。

价值观的地理地方信息连串运用部分如“5分树QuadTree”或“R-Tree”来做地理地方索引。那几个数据结构的内容须要被在特出的地点更新,并且,假如数据量相当的大的话,操作开销会很高。另3个办法是我们得以遍历贰个二维的数据结构并把其扁平化成1个列表。贰个威名赫赫的事例是Geohash(地理哈希)。三个Geohash使用“之字形”的途径扫描三个2维的长空,而且遍历中的移动可以被不难地用0和1来表示其大方向,然后在活动的进度中暴发0/1串。下图呈现了这一算法:(陈皓注:先把地图分成四份,经度为率先位,纬度为第②人,于是左侧的经度是0,左侧的是1,纬度也一样,上边是为1,下边的为0,那样,经纬度就可以组成成01,11,00,10那多少个值,其标识了四块区域,大家可以如此不断的递归地对每一个区域开展陆分,然后可以收获一串1和0结合的字串,然后拔取0-9,b-z去掉(去掉a,
i, l,
o)那三13个字母举办base32编码得到多少个七个长度的编码,那就是Geohash的算法)

地理 3

Geohash Index

Geohash的最精锐的功用是行使简易的位操作就足以知晓多少个区域间的偏离,就好像图中所示(陈皓:proximity框着的那五个,这几个很像IP地址了)。Geohash把三个二维的坐标生生地改成了2个一维的数据模型,那就是降维技术。BigTable的降维技术参考到作品前边的[6.1]。更加多的有关Geohash和任何技术可以参考[6.2]
和 [6.3]。

**适用性:** Key-Value Store键值对数据库,Document
Databases文档数据库,BigTable风格的数据库。

自定义的标注已毕了,自定义气泡呢?那关系到一个paopaoView,相当于BMKAnnotationView内部的壹天性质,它就是点击触发的血泡视图。
在上头的(2)方法中,添加一段paopaoView代码

(12)邻接列表 Adjacency Lists

Adjacency
Lists邻接列表是一种图–每二个结点都以3个独门的记录,其富含了颇具的父结点或子结点。那样,我们就可以透过给定的父或子结点来进展检索。当然,大家须求经过hop查询遍历图。这几个技术在广度和纵深查询,以及拿到有个别结点的子树上尚无功效。

适用性:Key-Value键值对数据库,Document Databases文档数据库

- (void)onGetTransitRouteResult:(BMKRouteSearch *)searcher result:(BMKTransitRouteResult *)result errorCode:(BMKSearchErrorCode)error {
    if (error == BMK_SEARCH_NO_ERROR) {
        //在此处理正常结果
        BMKTransitRouteLine* plan = (BMKTransitRouteLine*)[result.routes objectAtIndex:0];
        NSInteger size = [plan.steps count];
        NSLog(@"size == %ld", (long)size);
        int planPointCounts = 0;
        for (int i = 0; i < size; i++) {
            BMKTransitStep *tansitStep = [plan.steps objectAtIndex:i];
            if (i == 0 ) {
                RouteAnnotation *item = [[RouteAnnotation alloc] init];
                item.coordinate = plan.starting.location;
                item.title = @"起点";
                item.type = 0;
                [_mapView addAnnotation:item]; //添加起点标注
            } else if (i == size - 1) {
                RouteAnnotation *item = [[RouteAnnotation alloc] init];
                item.coordinate = plan.terminal.location;
                item.title = @"终点";
                item.type = 1;
                [_mapView addAnnotation:item];
            }
            RouteAnnotation *item = [[RouteAnnotation alloc] init];
            item.coordinate = tansitStep.entrace.location; //路段入口信息
            item.title = tansitStep.instruction; //路程换成说明
            item.type = 3;
            [_mapView addAnnotation:item];

            //轨迹点总数累计
            planPointCounts += tansitStep.pointsCount;
        }

        //轨迹点
        BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; //文件后缀名改为mm
        int i = 0;
        for (int j = 0; j < size; j++) {
            BMKTransitStep *transitStep = [plan.steps objectAtIndex:j];
            int k = 0;
            for (k = 0; k < transitStep.pointsCount; k++) {
                temppoints[i].x = transitStep.points[k].x;
                temppoints[i].y = transitStep.points[k].y;
                i++;
            }
        }
        //通过points构建BMKPolyline
        BMKPolyline *polyLine = [BMKPolyline polylineWithPoints:temppoints count:planPointCounts];
        [_mapView addOverlay:polyLine]; //添加路线overlay
        delete []temppoints;
        [self mapViewFitPolyLine:polyLine];
    }
    else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){
        //当路线起终点有歧义时通,获取建议检索起终点
        //result.routeAddrResult
    }
    else {
        NSLog(@"抱歉,未找到结果");
    }
}

下边是本文:

(2)
对BMKAnnotationView操作,新建2个类继承于BMKAnnotationView,在.h中扬言1个性能

  • 最后用户一般更感兴趣于数据的集结显示,而不是分手的多寡,那关键透过SQL来完结。
  • 咱俩无能为力通过人手工控制数据的并发性,完整性,一致性,或是数据类型校验那一个东西的。那就是为啥SQL要求在业务,二维表结构(schema)和外部联合上做过多事。

在.m文件中重写init方法

(15)嵌套文档扁平化:有限的字段名Nested Documents Flattening:Numbered Field Names

摸索引擎基本上来说和扁平文档一同工作,如:每三个文档是三个扁平的字段和值的例表。那种数据模型的用来把作业实体映射到一个文本文档上,假设你的工作实体有很复杂的内部结构,那说不定会变得很有挑衅。1个鳌头独占的挑衅是把三个有层级的文档映映射出来。例如,文档中嵌套另贰个文档。让大家看看上边的演示:

地理 4

Nested Documents Problem

上边的每二个事情实体代码一种简历。其包蕴了人名和多个技术列表。小编把那些层级文档映射成1个文本文档,一种艺术是成立Skill和Level字段。那个模型可以因而技能可能等级来探寻一人,而上图标注的那么的咬合查询则会破产。(陈皓注:因为分不清Excellent是或不是是Math依然Poetry上的)

在引用中的[4.6]提交了一种缓解方案。其为每一个字段都标上数字 Skill_i 和 Level_i,那样就可以分离搜索每八个对(下图中应用了O卡宴来遍历查找全部大概的字段):

地理 5

Nested Document Modeling using Numbered Field Names

如此那般的方式根本没有伸张性,对于有个别犬牙相错的难题来说只会让代码复杂度和珍视工作变大。

地理,适用性:Search Engines全文检索

bus.gif

(9)键组合聚合 Aggregation with Composite Keys

Composite
keys键组合技术并不只能用来做索引,同样可以用来区分不用的连串的数目以协理数据分组。考虑八个例子,大家有几个海量的日志数组,这几个日志记录了互连网上的用户的走访来源。我们必要总计从某一网站苏醒的单独访客的数据,在关系型数据库中,大家只怕要求下边那样的SQL查询语句:

  1. SELECT count(distinct(user_id)) FROM clicks GROUP BY site  

小编们可以在NoSQL中树立如下的数据模型:

地理 6

Counting Unique Users using Composite Keys

诸如此类,大家就可以把数据按UserID来排序,大家就足以很不难把同贰个用户的多寡(1个用户并不会发生太多的event)进行拍卖,去掉这么些重复的站点(使用hash
table或是其他什么)。另2个可选的技能是,大家可以对每二个用户建立1个数据实体,然后把其站点来源追加到那个数量实体中,当然,那样一来,数据的翻新在品质比较之下会有肯定损失。

**适用性:** Ordered Key-Value Store 排序键值对数据库,
BigTable风格的数据库。

在button点击方法里福寿康宁上面的代码

  • Ordered
    Key-Value有序键值
    模型也不行强劲,但是,其也尚未对Value提供某种数据模型。常常来说,Value的模子可以由运用负责解析和存取。这种很不便民,于是应运而生了BigTable类型的数据库,这一个数据模型其实就是map里有map,map里再套map,一层一层套下去,约等于少有嵌套的key-
    value(value里又是一个key-value),这种数据库的Value主要透过“列族”(column
    families),列,和岁月截来控制版本。(陈皓注:关于时间截来对数据的版本控制紧若是杀鸡取蛋数据存储并发难点,相当于所谓的开阔锁,详见《多版本出现控制(MVCC)在分布式系统中的应用》)
@property (nonatomic, strong) UIImageView *bgImageView;

通用建模技术General Modeling Techniques

在本书中,大家将商讨NoSQL中各个不一致的通用的数额建模技术。

对了,假使您想算出初阶到完工的离开(非直线距离,一般大家都算走过的路途),可以间接在公交的代办方法中,用BMKTransitRouteLine的distance属性,再除以一千,就可以算出英里数了,非常粗大略吗??~~~

(3)应用层联结Application Side Joins

表联结基本上不被NoSQL援救。正如我们前边所说的,NoSQL是“面向难题”而不是“面向答案”的,不援救表联结就是“面向难题”的结局。表的见面是在统筹时被社团出来的,而不是在实施时建造出来的。所以,表联结在运作时是有一点都不小支出的(陈皓注:搞过SQL表联结的都知情笛Carl积是怎么东西,大可以在参考以前酷壳的“图解数据库表Joins”),不过在使用了Denormalization和Aggregates技术后,大家着力不用举办表联结,如:你们使用嵌套式的多寡实体。当然,即使你须要联合数据,你需求在应用层完毕那几个事。上面是多少个首要的Use
Case:

  • 多对多的多少实体关系——平日要求被接连或联合。

  • 聚合Aggregates并不适用于数据字段经常被改动的气象。对此,大家必要把那七个经常被转移的字段分到别的的表中,而在询问时大家须要联合数据。例如,大家有个Message系统能够有1个User实体,其包罗了贰个内嵌的Message实体。可是,如若用户不断在附加message,那么,最好把message拆分到另一个独立的实业,但在查询时联结那User和Message那七个实体。如下图:

适用性: Key-Value Store键值对数据库,Document
Databases文档数据库,BigTable风格的数据库,Graph Databases图数据库。

- (BMKAnnotationView*)getRouteAnnotationView:(BMKMapView *)mapview viewForAnnotation:(RouteAnnotation*)routeAnnotation
{
    BMKAnnotationView* view = nil;
    switch (routeAnnotation.type) {
        case 0:
        {
            view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"start_node"];
            if (view == nil) {
                view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"start_node"];
                view.image = [UIImage imageNamed:@"icon_nav_start.png"];
                view.centerOffset = CGPointMake(0, -(view.frame.size.height * 0.5));
                view.canShowCallout = TRUE;
            }
            view.annotation = routeAnnotation;
        }
            break;
        case 1:
        {
            view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"end_node"];
            if (view == nil) {
                view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"end_node"];
                view.image = [UIImage imageNamed:@"icon_nav_end.png"];
                view.centerOffset = CGPointMake(0, -(view.frame.size.height * 0.5));
                view.canShowCallout = TRUE;
            }
            view.annotation = routeAnnotation;
        }
            break;
        case 2:
        {
            view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"bus_node"];
            if (view == nil) {
                view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"bus_node"];
                view.image = [UIImage imageNamed:@"icon_nav_bus.png"];
                view.canShowCallout = TRUE;
            }
            view.annotation = routeAnnotation;
        }
            break;
        case 3:
        {
            view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"rail_node"];
            if (view == nil) {
                view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"rail_node"];
                view.image = [UIImage imageNamed:@"icon_nav_rail.png"];
                view.canShowCallout = TRUE;
            }
            view.annotation = routeAnnotation;
        }
            break;
        case 4:
        {
            view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"route_node"];
            if (view == nil) {
                view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"route_node"];
                view.canShowCallout = TRUE;
            } else {
                [view setNeedsDisplay];
            }

//            UIImage* image = [UIImage imageNamed:@"icon_direction.png"];
//            view.image = [image imageRotatedByDegrees:routeAnnotation.degree];
            view.annotation = routeAnnotation;

        }
            break;
        case 5:
        {
            view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"waypoint_node"];
            if (view == nil) {
                view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"waypoint_node"];
                view.canShowCallout = TRUE;
            } else {
                [view setNeedsDisplay];
            }

//            UIImage* image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_nav_waypoint.png"]];
//            view.image = [image imageRotatedByDegrees:routeAnnotation.degree];
            view.annotation = routeAnnotation;
        }
            break;
        default:
            break;
    }

    return view;
}

一方面,SQL可以让软件应用程序在诸多气象下不需求关爱数据库的数码聚合,和数据完整性和实惠举办控制。而倘使大家去除了数量一致性,完整性那一个事物,会对质量和遍布存储有第一的救助。正因为那样,我们才有数据模型的前行:

- (id)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
        self.centerOffset = CGPointMake(0, 0);
        self.frame = CGRectMake(0, 0, 39, 39);

        _bgImageView = [[UIImageView alloc] initWithFrame:self.frame];
                _bgImageView.image = [UIImage imageNamed:@"iconsend.png"];
        [self addSubview:_bgImageView];

        UIImageView *paoView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
        paoView.image =[UIImage imageNamed:@"iconsend.png"];
        self.paopaoView = [[BMKActionPaopaoView alloc] initWithCustomView:paoView];

    }
    return self;
}
(11)树形聚合Tree Aggregation

树形或是任意的图(需反规格化)可以被一贯打成一条记下或文档存放。

  • 当树形结构被壹回性取出时那会至极有功效(如:大家须求显示三个blog的树形评论)
  • 探寻和此外存取这一个实体都会设不日常。
  • 对于多数NoSQL的完成的话,更新数据都以很不划算的(比较起独立结点来说)

地理 7

Tree Aggregation

适用性:Key-Value键值对数据库,Document Databases文档数据库

在viewdidload中,

(17) 图结构批处理 Batch Graph Processing

Graph
databases图数据库,如neo4j是一个独立的图数据库,尤其是利用贰个结点来探究邻居结点,或是探索三个或少量结点前的关系。不过处理多量的图数据是很没有成效的,因为图数据库的属性和增加性并不是其目标。分布式的图数据处理可以被MapReduce
和 Message Passing
pattern来拍卖。如:在自小编前一篇的篇章中的那么些示例。那么些法子可以让Key-Value
stores, Document databases和BigTable-style databases适合于处理大图。

小说来源:酷壳网

(3) 生成对应气泡时候触发的办法

(8)键组合索引 Composite Key Index

Composite
key键组合是叁个很常用的技艺,对此,当大家的数据库资助键排序时能取得极大的好处。Composite
key组合键的拼接成为第叁排序字段可以让你营造出一种多维索引,那很像我们后边说过的 Dimensionality
Reduction降维技术。例如,大家需求存取用户总计。即使大家须要依照区其余所在来计算用户的分布情形,大家得以把Key设计成这么的格式 (State:City:UserID),那样一来,就使得大家得以经过State到City来按组遍历用户,尤其是大家的NoSQL数据库接济在key上按区查询(如:BigTable类的种类):

  1. SELECT Values WHERE state=”CA:*” 
  2. SELECT Values WHERE city=”CA:San Francisco*” 

Composite Key Index

**适用性:** BigTable 数据库。

2.基本地图的贯彻
在appdelegate中导入<BaiduMapAPI_Base/BMKMapManager.h>框架,并听从BMKGeneralDelegate代理,在didFinishLaunchingWithOptions方法中落到实处如下代码

6.地理反编码
地理反编码的拔取一般是运动地图,然后展现附近的地理新闻(大家广阔的app上这些职能相似是和poi搜索合作使用的)
表明变量,遵从代理

(14)嵌套集 Nested Sets

Nested
sets
嵌套集是树形结构的标准技术。它被广泛地用在了关系性数据库中,它完全地适用于Key-Value键值对数据库和Document
Databases文档数据库。那一个技术的想法是把叶子结点存储成一个数组,并经过应用索引的起来和终结来映射每三个非叶子结点到八个叶子结点集,就像下图所示一样:

地理 8

Modeling of eCommerce Catalog using Nested Sets

那般的数据结构对于immutable
data不变的数目有很是科学的频率,因为其点内存空间小,并且可以便捷地找出装有的纸牌结点而不须要树的遍历。尽管如此,在插入和翻新上急需很高的性质开销,因为新的纸牌结点须要广大地立异索引。

适用性:Key-Value Stores键值数据库,Document Databases文档数据库

//遵循代理写在viewwillappear中
- (void)viewWillAppear:(BOOL)animated {
    [_mapView viewWillAppear];
    _mapView.delegate = self;
    _locService.delegate = self;
    _geoCodeSearch.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated {
    [_mapView viewWillDisappear];
    _mapView.delegate = nil;
    _locService.delegate = nil;
    _geoCodeSearch.delegate = nil;
}

地理 9

在地点的代码中,大家用的是BMKTransitRoutePlanOption,约等于公交(地铁)格局,如若您想用其余(比如步行,大概骑乘,驾车等),可在那替换方法

  • Key-Value键值对存储是极度不难而强劲的。上面的浩大技术基本上都以基于那些技能伊始提升的。但是,Key-Value有1个格外沉重的标题,那就是只要大家须求摸索一段范围内的key。(陈皓注:学过hash-table数据结构的人都应该清楚,hash-table是非系列容器,其并不像数组,链接,队列那些有序容器,大家得以控制数据存储的依次)。于是,有序键值(Ordered
    Key-Value)数据模型被设计出来化解这一限量,来从根本上升高数据集的难点。

效益图如下

相对续续写了一些天,挺多的,也可望能帮到不怎么会地图集成的同伙们~
更新:有的小伙伴需求demo,小编上传了github上,地址:https://github.com/Feijunjie/BaiduMapDemo/tree/master
之所以,借使你以为自身写的正确恐怕帮到您了,就给自身点个赞吧

(13) Materialized Paths

Materialized
Paths可以扶助防止递归遍历(如:树形结构)。那些技能也得以被认为是反规格化的一种变种。其想尽是为每种结点加上父结点或子结点的标识属性,那样就可以不须要遍历就清楚全数的后裔结点和祖辈结点了:

地理 10

Materialized Paths for eShop Category Hierarchy

其一技术对于全文检索引擎来说十二分有资助,因为其得以允许把一个层级结构转成2个文档。上边的示图中大家得以见见有着的商品或Men’s
Shoes
下的子分类可以被一条相当的短的查询语句处理——只必要给定个分类名。

Materialized
Paths可以储存1个ID的集结,或是一堆ID拼出的字符串。后者允许你通过四个正则表明式来寻找三个特定的道岔路径。下图体现了这么些技术(分支的门径归纳了结点本人):

地理 11

Query Materialized Paths using RegExp

适用性:Key-Value键值对数据库,Document Databases文档数据,Search
Engines搜索引擎

UITextField *poiTextField = [[UITextField alloc] initWithFrame:CGRectMake(30, 30, 100, 20)];
    poiTextField.backgroundColor = [UIColor lightGrayColor];
    [poiTextField addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventEditingChanged];
    poiTextField.delegate = self;
    [self.view addSubview:poiTextField];

- (void)valueChange:(UITextField *)textField {
    NSLog(@"123");

    _poiSearch = [[BMKPoiSearch alloc] init];
    _poiSearch.delegate = self;
    NSLog(@"搜索:%@",textField.text);
    //附近云检索
    BMKNearbySearchOption *nearBySearchOption = [[BMKNearbySearchOption alloc] init];
    nearBySearchOption.pageIndex = 0;
    nearBySearchOption.pageCapacity = 10;
    nearBySearchOption.keyword = textField.text;

    //检索的中心点
    nearBySearchOption.location = _locService.userLocation.location.coordinate;
    nearBySearchOption.radius = 100;

    BOOL flag = [_poiSearch poiSearchNearBy:nearBySearchOption];
    if (flag) {
        NSLog(@"success");
    } else {
        NSLog(@"fail");
    }
}
(10)反转搜索 Inverted Search – 直接聚合 Direct Aggregation

这么些技术越多的是数额处理技术,而不是多少建模技术。即便如此,那几个技术如故会潜移默化数据模型。这么些技能最重大的想法是利用多个目录来找到满意某条件的数额,不过把多少聚合起必要动用全文检索。如故让我们来说一个演示。如故用地点拾叁分例子,大家有成百上千的日记,其中囊括互连网用户和她们的拜访来源。让我们若是每条记下都有三个UserID,还有用户的连串 (Men,Women,Bloggers,等),以及用户所在的城市,和做客过的站点。我们要干的事是,为各类用户种类找到满意有些条件(访问源,所在城市,等)的的单独用户。

很肯定,我们要求摸索那么些满意条件的用户,即便大家利用反转搜索,那会让大家把那事干得很简单,如: {Category
-> [user IDs]}
 或 {Site -> [user
IDs]}
。使用这样的目录,大家得以取多个或四个UserID要的犬牙相制或并集(这些事很不难干,而且可以干得十分的快,若是那些UserID是排好序的)。不过,大家要按用户种类来生成报表会变得有点辛勤,因为我们用言语或许会像下边那样

  1. SELECT count(distinct(user_id)) … GROUP BY category  

但如此的SQL很没有作用,因为category数据太多了。为了回应那一个难点,大家可以创立三个直接索引 {UserID
-> [Categories]}
下一场大家用它来生成报表:

地理 12

Counting Unique Users using Inverse and Direct Indexes

终极,我们需求精晓,对各种UserID的即兴询问是很没有作用的。大家可以透过批查询处理来化解这么些标题。那代表,对于一些用户集,咱们得以开展预处理(分歧的询问条件)。

适用性: Key-Value Store键值对数据库,Document
Databases文档数据库,BigTable风格的数据库。

在上头结尾那里大家添加了门道overlay,所以我们要贯彻overlay的代办方法

(2)聚合Aggregates

富有类型的NoSQL数据库都会提供灵活的Schema(数据结构,对数据格式的界定):

  • Key-Value Stores 和 Graph
    Databases基本上来说不会Value的款型,所以Value可以是任意格式。那样一来,这使得我们可以任意组合二个作业实体的keys。比如,我们有二个用户帐号的事情实体,其得以被如下这几个key组合起来: UserID_name,UserID_email,
    UserID_messages
    等等。假若三个用户并未email或message,那么相应也不会有那般的笔录。

  • BigTable模型通过列集合来支持灵活的Schema,大家称为列族(column
    family
    )。BigTable还足以在同等记录上冒出区其他版本(通过时间截)。

  • Document
    databases文档数据库是一种层级式的“去Schema”的积存,就算有些那样的数据库允许检验需求保留的数额是或不是满意某种Schema。

利落的Schema允许你可以用一种嵌套式的里边数据格局来存储一组有涉及的事情实体(陈皓注:类似于JSON这样的多寡封装格式)。那样可以为我们带来七个好处。

  • 最小化“一对多”关系——可以透过嵌套式的点子来囤积实体,那样可以少一些表联结。

  • 可以让其中技术上的数码存储更接近于业务实体,尤其是那种混合式的事情实体。可能存于三个文档集或是一张表中。

下图表示了那二种利益。图中描给了电子商务中的商品模型(陈皓注:我记得本人在“挑衅无处不在”一文中说到过电商中产品分类数据库设计的挑衅)

  • 首先,全体的商品Product都会有3个ID,Price和Description。

  • 下一场,大家得以知晓差别的门类的货色会有例外的质量。比如,小编是书的性质,长度是直筒裤的性质。其些属性只怕是“一对多”或是“多对多”的关系,如:唱片中的曲目。

  • 接下去,大家驾驭,有些事情实体不可以应用固定的档次。如:哈伦裤的性质并不是有所的牌子都有的,而且,有些名牌还会搞万分特其余属性。

对此关系型数据库来说,要统筹那样的数据模型并不简单,而且设计出来的相对化离优雅很远很远。而大家NoSQL中灵活的Schema允许你利用二个聚合Aggregate
(product) 可以建出全数分化类型的货色和她俩的不等的属性:

地理 13

Entity Aggregation

上图中大家得以相比关系型数据库和NoSQL的距离。唯独大家得以看看在数码更新上,非规格化的数据存储在性质和一致性上会有很大的熏陶,那就是我们须要重点注意和不得不捐躯的地点

适用性: Key-Value Store键值对数据库,Document
Databases文档数据库,BigTable风格的数据库。

遵循BMKLocationServiceDelegate代理,定义BMKLocationService类
在position点击方法中

(1)反规格化Denormalization

反规格化Denormalization可以被认为是把相同的数量拷贝到差距的文档或是表中,那样就可以简化和优化查询,或是正好合乎用户的某中特地的数据模型。那篇小说中所说的多数技巧都或多或少地导向了这一技艺。

一体化来说,反规格化必要权衡上面这个东西:

  • 询问数据量
    /查询IO 
    VS 总和据量。使用反规格化,一方面可以把一条查询语句所须求的有所数据整合起来放到二个地点贮存。那表示,其余不相同差异查询所急需的均等的数据,必要放在别差其余地点。由此,那暴发了很多冗余的数目,从而致使了数据量的增大。

  • 拍卖千丝万缕度 VS 总数据量.
    在符合范式的数额形式上展开表连接的询问,很理解会大增了询问处理的复杂度,尤其对于分布式系统来说越发。反规格化的数据模型允许我们以有利于查询的艺术来存构造数据结构以简化查询复杂度。

适用性:Key-Value Store 键值对数据库,Document
Databases文档数据库,BigTable风格的数据库。

    _mapManager = [[BMKMapManager alloc] init];
    BOOL ret = [_mapManager start:@"你的key"generalDelegate:self];
    if (!ret) {
        NSLog(@"manager start failed!");
    }
    return YES;

概念技术Conceptual Techniques

这一节重视介绍NoSQL数据模型的中央标准。

活动地图的代办方法

(16)嵌套文档扁平化:邻近查询 Nested Documents Flattening: Proximity Queries

在附录[4.6]中付出了那个技术用来消除扁平层次文档。它用接近的询问来界定可被询问的单词的界定。下图中,全体的技术和级差被放在3个字段中,叫
SkillAndLevel,查询中出现的“Excellent”和“Poetry”必需一个紧跟另三个:

地理 14

Nested Document Modeling using Proximity Queries

附录[4.3]中描述了这一个技能被用在Solr中的3个成功案例。

适用性:Search Engines全文检索

在viewcontroller中,遵循BMKMapViewDelegate代理

  • Document databases
    文档数据库
     立异了BigTable模型,并提供了多少个有含义的改进。第三个是同意Value中有主观的形式(scheme),而不是map套map。第3个是索引。Full
    Text Search
    Engines全文检索引擎
    可以被作为是文档数据库的3个变种,他们得以提供灵活的可变的数量形式(scheme)以及机关索引。他们中间的差距点紧如果,文档数据库用字段名做索引,而全文检索引擎用字段值做索引。

自然了,假使你想同盟着poi使用,只需求把result.poiList数据源存储到数组中,然后在tableView中展现出来,你会了呢?~~~~

@property (nonatomic, strong) BMKGeoCodeSearch *geoCodeSearch;
    _pointAnnotation = [[BMKPointAnnotation alloc] init];
    _pointAnnotation.coordinate = userLocation.location.coordinate;
    _pointAnnotation.title = @"我在这个地方";
    _pointAnnotation.subtitle = @"你在哪呢";
    [_mapView addAnnotation:_pointAnnotation];
    [_mapView selectAnnotation:_pointAnnotation animated:YES];
- (void)PlanBtn:(UIButton *)btn {
    _routeSearch = [[BMKRouteSearch alloc] init];
    _routeSearch.delegate = self;

    //发起检索
    BMKPlanNode *start = [[BMKPlanNode alloc] init];
    start.name = @"国贸";
    BMKPlanNode *end = [[BMKPlanNode alloc] init];
    end.name = @"国家体育总局";

    BMKTransitRoutePlanOption *transiRouteS = [[BMKTransitRoutePlanOption alloc] init];
    transiRouteS.city = @"北京市";
    transiRouteS.from = start;
    transiRouteS.to = end;

    BOOL flag = [_routeSearch transitSearch:transiRouteS];
    if (flag) {
        NSLog(@"transtion检索发送成功");
    } else {
        NSLog(@"fail");
    }
}

本来了,你项目中想已毕其他系列,比如驾车(会有提示到哪拐弯之类的),你可以友善依据百度SDK中写的改一改(这几个途径设计可能看一看百度SDK吧,小编在那不多写了,终归情势都同样,只是种类多)。

4.标注
讲标注此前,须要弄懂七个类的界别,BMKPointAnnotation和BMKAnnotationView,很多初入地图行的人都弄不清(小编自个儿一初始也是),前者官方解释的是三个点的标注,后者则是标注视图,好像如故不知道0.0。。。。依照自个儿的了然就是:前者代表1个点,比如您地图上有很多革命大头针,大头针往那边一插,是还是不是有个点?这么些点,就意味着BMKPointAnnotation,具有地理的中纬度特性(其余的片段消息也可以写在此间,借使你的后台将一文山会长虹息包含经纬度消息传给你的话,你就足以重写那个类)。BMKAnnotationView则表示这些革命大头针,什么?淡青大头针不难堪,笔者要换来德玛西亚巨剑,好的,直接在那么些BMKAnnotationView内部添加image即可,如何,弄懂了啊??
好,上边来代码,走起~
第三化解第二个难题,系统豉豆红定位小圆点太丑,要换我们协调的,OK。
(1) 对BMKPointAnnotation操作,上边定位赢得地理地点的代办方法中

@interface RouteAnnotation : BMKPointAnnotation
{
    int _type; //0:起点 1:终点 2:公交 3:地铁 4:驾乘 5:途经点
    int _degree;
}

@property (nonatomic) int type;
@property (nonatomic) int degree;
@end

@implementation RouteAnnotation

@synthesize type = _type;
@synthesize degree = _degree;

@end

在那里,你可以根据本人的内需转移线条的片段性质,不多说。
把上边那段代码复制到工程里,那是百度给大家写好的依据路径总计地图范围的,挺棒的,直接用他们的。

下一场地图出来,到这一步算是刚先河

[_mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];

俗话说,好记性不如烂笔头,关于集成地图 (那里以百度地图为例)
这一块,自身近日在一家代驾集团做了一年了,对这一块相比熟识,未来计算一下常用方法,希望能帮到有须要的同伙。

那个中调用了贰个艺术,我们用百度SDK中给大家写好的,由于她们写的较多,还关乎到其余文件,在那里大家就举个例证,所以有的自笔者给注掉了,我们就看个呈现效果,赏心悦目点的职能到时候大家再去百度SDK中把它的拿来。

if ([annotation isKindOfClass:[RouteAnnotation class]]) {
        return [self getRouteAnnotationView:mapView viewForAnnotation:annotation];
    }

geo.gif

    _locService.delegate = self;
    _mapView.zoomLevel = 14.1; //地图等级,数字越大越清晰
    _mapView.showsUserLocation = NO;//是否显示定位小蓝点,no不显示,我们下面要自定义的(这里显示前提要遵循代理方法,不可缺少)
    _mapView.userTrackingMode = BMKUserTrackingModeNone;
    //定位
    [_locService startUserLocationService];
    _mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.size.height - 100)];
    [self.view addSubview:_mapView];

是或不是得到大家要的多少了呢。然后把那几个多少彰显到tableview上,是或不是就好像大家广阔的搜索框搜索,拿到相应的结果了~~~

好了,到此处就是了结了,依照公交举办路径设计,完毕效益如下:

/根据polyline设置地图范围
- (void)mapViewFitPolyLine:(BMKPolyline *) polyLine {
    CGFloat ltX, ltY, rbX, rbY;
    if (polyLine.pointCount < 1) {
        return;
    }
    BMKMapPoint pt = polyLine.points[0];
    ltX = pt.x, ltY = pt.y;
    rbX = pt.x, rbY = pt.y;
    for (int i = 1; i < polyLine.pointCount; i++) {
        BMKMapPoint pt = polyLine.points[i];
        if (pt.x < ltX) {
            ltX = pt.x;
        }
        if (pt.x > rbX) {
            rbX = pt.x;
        }
        if (pt.y > ltY) {
            ltY = pt.y;
        }
        if (pt.y < rbY) {
            rbY = pt.y;
        }
    }
    BMKMapRect rect;
    rect.origin = BMKMapPointMake(ltX , ltY);
    rect.size = BMKMapSizeMake(rbX - ltX, rbY - ltY);
    [_mapView setVisibleMapRect:rect];
    _mapView.zoomLevel = _mapView.zoomLevel - 0.3;
}

5.POI检索
咱俩先定义3个输入框,然后根据输入的文字来大概的地点

2016-10-10更新

至于依据地图上大头针的分布范围,来动态缩放地图,写在此处了,要求的同伴可以看看
http://www.jianshu.com/p/2fb973092892

paopao.gif

@property (nonatomic, strong) BMKRouteSearch *routeSearch;

3.地图的稳定

稳定代理方法-(void)didUpdateBMKUserLocation:(BMKUserLocation
*)userLocation,在这么些办法中,定位时候能获拿到经纬度
userLocation.location.coordinate
接下来点击了,发现地图没有动静,那是干吗哩~
啊,原来我们忘记设置了地图的中央点

    UIButton *positionBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    positionBtn.frame = CGRectMake(30, 64, 70, 20);
    [positionBtn setTitle:@"定位" forState:UIControlStateNormal];
    [positionBtn addTarget:self action:@selector(position:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:positionBtn];
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {

        CLLocationCoordinate2D carLocation = [_mapView convertPoint:self.view.center toCoordinateFromView:self.view];
        BMKReverseGeoCodeOption *option = [[BMKReverseGeoCodeOption alloc] init];
        option.reverseGeoPoint = CLLocationCoordinate2DMake(carLocation.latitude, carLocation.longitude);
        NSLog(@"%f - %f", option.reverseGeoPoint.latitude, option.reverseGeoPoint.longitude);
        //调用发地址编码方法,让其在代理方法onGetReverseGeoCodeResult中输出
        [_geoCodeSearch reverseGeoCode:option];
}

//返回地理反编码
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error {
    if (result) {
        NSLog(@"%@ - %@ - %@ - %@ - %@", result.addressDetail.province, result.addressDetail.city, result.addressDetail.streetName, result.address, result.businessCircle);  
    } else {
        NSLog(@"找不到");
    }
}

如下图:

运行,如下

在回去的代理方法中,大家打印一下

[_mapView
addAnnotation:_pointAnnotation];,运转的时候她会活动去探寻BMKAnnotationView,那么些须求在标注代理方法中写。

        BMKTransitRouteLine* plan = (BMKTransitRouteLine*)[result.routes objectAtIndex:0];
        NSLog(@"juli is == %d公里", plan.distance / 1000);

出于地点大家用的是公交,所以下边大家要兑现公交的代办方法(各种办法有各种办法的代理方法)

Paste_Image.png

好了,第①步甘休。

还有大家如曾几何时候重写BMKPointAnnotation呢,一般的话他只是传个地理地点新闻,当大家在地形图上想要突显五个地理地点音讯的时候,比如后台重回来三个数组,里面每一种成分都以一个字典,各种字典代表多少个单位,除了地理地点音信,还有任何新闻,比如名字,图片等,对应的是种种地理地方,那时候重写BMKPointAnnotation,并在里面定义三个model属性,用来收纳后台重回来的model新闻串。然后申明那个pointAnnotation类的对象,并给她赋值后台重临来的model音讯串中的地点音讯,并将一切model传给他,前边的操作和方面的步子一样。
切实想如何是好,看您协调~~~

出于大家在公交的代理方法中添加了标注,所以大家要在标注的代办方法中落实我们自定义的标号

#import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件
#import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件
#import <BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件
#import <BaiduMapAPI_Cloud/BMKCloudSearchComponent.h>//引入云检索功能所有的头文件
#import <BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件
#import <BaiduMapAPI_Utils/BMKUtilsComponent.h>//引入计算工具所有的头文件
#import <BaiduMapAPI_Radar/BMKRadarComponent.h>//引入周边雷达功能所有的头文件
#import <BaiduMapAPI_Map/BMKMapView.h>//只引入所需的单个头文件

poi.gif

- (BMKOverlayView*)mapView:(BMKMapView *)map viewForOverlay:(id<BMKOverlay>)overlay
{
    if ([overlay isKindOfClass:[BMKPolyline class]]) {
        BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
        polylineView.fillColor = [[UIColor alloc] initWithRed:0 green:1 blue:1 alpha:1];
        polylineView.strokeColor = [[UIColor alloc] initWithRed:0 green:0 blue:1 alpha:0.7];
        polylineView.lineWidth = 3.0;
        return polylineView;
    }
    return nil;
}

打印结果如下图:

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图