iOS 地图数据多条件筛选

一:实现需求

根据 类别(小学,初中,高中),级别,性质,区域等条件来筛选云图中的数据,使其显示的地图上;当前地图可视范围内最多显示30条数据(10个学校名称,20个麻点),边移动或者缩放要边重新获取数据并且筛选数据。


效果图

二:实现难点和解决方案

1:高德筛选的接口筛选一个字段只能连续筛选且多条件筛选传参数也极其不方便;

@property (nonatomic, strong) NSArray *filter;

示例:数组{@"type:酒店", @"star:[3,5]"}的含义,等同于SQL语句:WHERE type = "酒店" AND star BETWEEN 3 AND 5

2:所以只能客户端获取当前可视地图区域数据后再进行筛选

1):一次请求只能获取100条数据,不能一次把当前数据筛选完;

/// 可选, 每页记录数(每页最大记录数100, 默认20)

@property (nonatomic, assign) NSInteger offset;

/// 可选, 当前页数(>=1, 默认1)

@property (nonatomic, assign) NSInteger page;

解决方案:

上一页有100条,并且没筛选到30条就再获取下一页数据;

筛选出来30条,或者云图筛选完毕就去地图展示数据;

2):先从云图获取数据再进行最多四种条件的筛选

以前的做法:

NSMutableArray *foods = [@[] mutableCopy];for(Food *foodinself.sources) {if([food.nameisEqualToString:@"呵呵"]) {

[arrayMaddObject:food];

}

}

//做一个筛选 - 筛选完或者筛选了30个结果后显示出来

//四筛一

//四筛二

//四筛三

//四筛四

这种做法在要筛选四种条件的情况下将会非常低效,而且复杂,情况非常多;

现在的做法:

NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。

可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。其实意思就是:我是一个过滤器,不符合条件的都滚开。

NSPredicate的基本语法

我们使用一门语言,无论是外语还是计算机语言,总是从语法开始的,这样我们才能正确的把握逻辑。所以我们从语法开始说起。在这部分我们仅关心其语法的使用

只要我们使用谓词(NSPredicate)都需要为谓词定义谓词表达式,而这个表达式必须是一个返回BOOL的值。

谓词表达式由表达式、运算符和值构成。

-(void)filterFourConditonWihtPois:(NSArray *)pois{

[self.predicateArr removeAllObjects];

if (self.typeArr.count) {

//address  customFields

NSPredicate * p1 = [NSPredicate predicateWithFormat:@"type in %@", self.typeArr];//SELF

[self.predicateArr addObject:p1];

}

if (self.gradeArr.count) {

NSPredicate * p2 = [NSPredicate predicateWithFormat:@"grade in %@", self.gradeArr];

[self.predicateArr addObject:p2];

}

if (self.is_publicArr.count) {

NSPredicate * p3 = [NSPredicate predicateWithFormat:@"is_public in %@", self.is_publicArr];

[self.predicateArr addObject:p3];

}

if (self.disArr.count) {

NSPredicate * p4 = [NSPredicate predicateWithFormat:@"dis_id in %@", self.disArr];

[self.predicateArr addObject:p4];

}

if (self.predicateArr.count) {

//        NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:self.predicateArr];

NSPredicate * predicate = [NSCompoundPredicate andPredicateWithSubpredicates:self.predicateArr];

NSInteger count = 0;

for (AMapCloudPOI *aPOI in pois) {

BOOL match = [predicate evaluateWithObject:aPOI.customFields];

NSLog (@"%s", (match) ? "YES" : "NO");//看到这里我们会发现evaluateWithObject:方法返回的是一个BOOL值,如果符合条件就返回YES,不符合就返回NO。

if (match) {

[self.selectedPoiArray addObject:aPOI];

count ++;

if (count == 30) {

break;

}

}

}

//上一页有100条,并且没筛选到30条就再获取下一页数据

if (self.dataCount == 100 && count < 30) {

self.page ++;

[self cloudPlacePolygonSearch];

}else{//筛选出来30条,或者云图筛选完毕就去地图展示数据

if (count == 0) {

[self.view makeToast:@"未筛选到数据"];

}

[self addAnnotionsWithPOIs:self.selectedPoiArray];

}

}else{

[self addAnnotionsWithPOIs:pois];

}

}

注意事项:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"is_public in %@", self.is_publicArr];

筛选语句里面的数字不能为字符串类型,要转换成数字类型,否则不能筛选成功;

for (NSString * str in arr[0]) {

if ([str isEqualToString:@"公办"]) {

NSNumber * number =[NSNumber numberWithInt:1];

[self.is_publicArr addObject:number];

}else if ([str isEqualToString:@"私立"]){

NSNumber * number =[NSNumber numberWithInt:0];

[self.is_publicArr addObject:number];

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 4,210评论 0 33
  • 首先,我们需要知道何谓谓词,让我们看看官方的解释:The NSPredicate class is used to...
    旭日飞扬阅读 1,454评论 0 0
  • 本文是对 MagicalRecord github上的翻译 正文:注意: MagicalRecord 在 ARC...
    騂跃神话阅读 1,933评论 1 5
  • 在阳台上坐着一位少女,这少女看上去十六岁左右。长而微卷的睫毛下,一紫色一水蓝的眼睛(两只眼睛的颜色分别和她的父...
    可知冰水心凉阅读 437评论 0 0
  • 20170424 Hey,宝贝,今天我们参加了共享单车的市场调研,去了解共享单车的受众客户情况(年龄,喜好。。)妈...
    春芸1216阅读 337评论 6 7