在iOS应用程序服务器上的文本文件中搜索纬度和经度范围
我试图在一个文本文件(可在url上找到)中搜索,其中有纬度、经度和其他用逗号分隔的信息。 我需要在应用程序中搜索距离用户所选纬度最近的纬度。 代码是用来读取该文件并进行搜索的,但它不能完美地工作。 请让我知道,在这种情况下我应该如何处理。 1) 文件得到实时更新,所以每次用户选择位置并单击获取信息时,我都需要调用url并读取文件。 2) 然后搜索距离用户所选lat lon最近的lat lon NSDICTIONARY数据获取:-在iOS应用程序服务器上的文本文件中搜索纬度和经度范围,ios,objective-c,iphone,Ios,Objective C,Iphone,我试图在一个文本文件(可在url上找到)中搜索,其中有纬度、经度和其他用逗号分隔的信息。 我需要在应用程序中搜索距离用户所选纬度最近的纬度。 代码是用来读取该文件并进行搜索的,但它不能完美地工作。 请让我知道,在这种情况下我应该如何处理。 1) 文件得到实时更新,所以每次用户选择位置并单击获取信息时,我都需要调用url并读取文件。 2) 然后搜索距离用户所选lat lon最近的lat lon NSDICTIONARY数据获取:- ( { "altitude_m" = "90.0"
(
{
"altitude_m" = "90.0";
engName = “Station 1”;
grkName = "\U039d\U03ad\U03b1 \U039c\U03ac\U03ba\U03c1\U03b7 \U0391\U03c4\U03c4\U03b9\U03ba\U03ae\U03c2";
"humidity_P" = "50.0";
lat = "38.058873";
"local_time" = "16:20";
lon = "23.976741";
"pressure_hPA" = "1019.9";
"rain_mm" = "0.0";
"tem_C" = "17.2";
"wind_Gusts_khm" = "51.5";
"wind_degrees" = "22.5";
"wind_kmh" = "25.7";
}
{
"altitude_m" = "90.0";
engName = “Station 2”;
grkName = "\U039d\U03ad\U03b1 \U039c\U03ac\U03ba\U03c1\U03b7 \U0391\U03c4\U03c4\U03b9\U03ba\U03ae\U03c2";
"humidity_P" = "50.0";
lat = "38.048873";
"local_time" = "16:20";
lon = "23.876741";
"pressure_hPA" = "1019.9";
"rain_mm" = "0.0";
"tem_C" = "17.2";
"wind_Gusts_khm" = "51.5";
"wind_degrees" = "22.5";
"wind_kmh" = "25.7";
}
{
"altitude_m" = "90.0";
engName = “Station 3”;
grkName = "\U039d\U03ad\U03b1 \U039c\U03ac\U03ba\U03c1\U03b7 \U0391\U03c4\U03c4\U03b9\U03ba\U03ae\U03c2";
"humidity_P" = "50.0";
lat = "38.059873";
"local_time" = "16:20";
lon = "23.986741";
"pressure_hPA" = "1019.9";
"rain_mm" = "0.0";
"tem_C" = "17.2";
"wind_Gusts_khm" = "51.5";
"wind_degrees" = "22.5";
"wind_kmh" = "25.7";
}
//匹配功能:-
-(void)matchLAtLongNow: (NSString *)latitude :(NSString *)longitude {
CLLocationCoordinate2D pinlocation;
pinlocation.latitude = [latitude doubleValue];
pinlocation.longitude = [longitude doubleValue];
float minLat = pinlocation.latitude - (searchDistance / 69);
float maxLat = pinlocation.latitude + (searchDistance / 69);
float minLon = pinlocation.longitude - searchDistance / fabs(cos(deg2rad(pinlocation.latitude))*69);
float maxLon = pinlocation.longitude + searchDistance / fabs(cos(deg2rad(pinlocation.longitude))*69);
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"lat <= %f AND lat >= %f AND lon <= %f AND lon >= %f",
maxLat, minLat, maxLon, minLon];
MatchedTxtArray = [myArray filteredArrayUsingPredicate:applePred];
}
-(void)matchLAtLongNow:(NSString*)纬度:(NSString*)经度{
CLLOCATIONCoordinated2D引脚定位;
pinlocation.latitude=[latitude doubleValue];
pinlocation.longitude=[longitude doubleValue];
float minLat=pinlocation.latitude-(搜索距离/69);
float maxLat=pinlocation.latitude+(搜索距离/69);
float minLon=pinlocation.longitude-searchDistance/fabs(cos(deg2rad(pinlocation.latitude))*69);
float maxLon=pinlocation.longitude+searchDistance/fabs(cos(deg2rad(pinlocation.longitude))*69);
NSPredicate*谓词=[NSPredicate谓词格式:
@“lat=%f和lon=%f”,
maxLat,minLat,maxLon,minLon];
MatchedTxtArray=[myArray filteredArrayUsingPredicate:applePred];
}
//获取错误
*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFNumber\u fastCStringContents]:未识别的选择器发送到实例0x175426460'
*第一次抛出调用堆栈:NSDictionary返回NSNumber。检查调用matchAtLongNow的位置:您可能在需要字符串的位置有NSNumber 听起来您需要地理搜索,而不是包含在某些阈值内。我会重新表述如下:
NSArray *objects; // this is your parsed file, an array of dictionaries
CLLocation *userLocation; // this is your user location
// sort the dictionary in order of distance to the userLocation
NSArray *sortedObjects = [objects sortedArrayUsingComparator:^(NSDictionary *objA,NSDictionary *objB) {
CLLocationDistance distanceA = [self distanceToObject:objA from:userLocation];
CLLocationDistance distanceB = [self distanceToObject:objB from:userLocation];
return (NSComparisonResult)(distanceB-distanceA);
}];
sortedObjects
将包含从距离用户位置最近到最远排序的字典
我们只需要一个函数,该函数生成字典中lat/lon值到用户位置的距离
- (CLLocationDistance)distanceToObject:(NSDictionary *)object from:(CLLocation *)location {
CLLocationDegrees latitude = [object[@"lat"] doubleValue];
CLLocationDegrees longitude = [object[@"lob"] doubleValue];
CLLocation *objectLocation = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
return [objectLocation distanceFromLocation:location];
}
谢谢你的回复。我检查了一下是否有字符串。