我使用谷歌地图放置自动完成API来自动完成用户键入的地址,一旦我完成了所需地址的选择,将从谷歌放置自动完成地址中选择的地址字符串传递到谷歌地图地理代码API,以获得详细的组件,问题是,有时地理编码API不会返回街道号码,即使自动完成API返回的地址相同,也不确定哪里出了问题,下面是我使用的代码和两个服务的输出
这就是我从地理代码服务检索详细地址的方式
NSString* address = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&sensor=false",completionText];
NSString* str = [address stringByReplacingOccurrencesOfString:@","
withString:@""];
str = [str stringByReplacingOccurrencesOfString:@" "
withString:@"+"];
NSURL *requestURL = [NSURL URLWithString:str];
NSURLRequest *request = [NSURLRequest requestWithURL:(requestURL)];
//response
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSError *jsonParsingError = nil;
NSDictionary *locationResults = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];
NSLog(@"%@",locationResults);
NSDictionary* results = [[locationResults objectForKey:@"results"] objectAtIndex:0];
NSArray* address_components = [results objectForKey:@"address_components"];
for (id addr in address_components) {
NSString *long_name = [addr valueForKey:@"long_name"];
NSString *short_name = [addr valueForKey:@"short_name"];
NSString *types = [[addr valueForKey:@"types"] objectAtIndex:0];
if ([types rangeOfString:@"street_number"].location != NSNotFound)
{
streetNum = long_name;
}
else if ([types rangeOfString:@"route"].location != NSNotFound)
{
streetName = long_name;
}
else if ([types rangeOfString:@"locality"].location != NSNotFound)
{
suburb = long_name;
}
else if ([types rangeOfString:@"administrative_area_level_1"].location != NSNotFound)
{
state = short_name;
}
else if ([types rangeOfString:@"country"].location != NSNotFound)
{
country = short_name;
}
else if ([types rangeOfString:@"postal_code"].location != NSNotFound)
{
postalCode = short_name;
}
以下是一个地址的例子,其中地址有街道编号,但地理编码点返回
{
"description" : "740 Spring Lane, Wallacedale, Victoria, Australia",
"id" : "ad2c41d2f934a30f4c5f8c4b336df8de988174d6",
"matched_substrings" : [
{
"length" : 10,
"offset" : 0
},
{
"length" : 8,
"offset" : 30
},
{
"length" : 9,
"offset" : 40
}
],
"place_id" : "EjE3NDAgU3ByaW5nIExhbmUsIFdhbGxhY2VkYWxlLCBWaWN0b3JpYSwgQXVzdHJhbGlh",
"reference" : "CkQ1AAAASPpKC9JU4XQoFf3LUYwoF_hJFRpFt5VE67NhCPs8vV9ghXvVUeKgPm-BH-Owx-zvuhHEPhJU-Y2ReK5S49AdphIQiKpvir0TegpxEAjmmNJEJhoUCt7KXyZ6LoN51qT50Unrl5ceYMU",
"terms" : [
{
"offset" : 0,
"value" : "740 Spring Lane"
},
{
"offset" : 17,
"value" : "Wallacedale"
},
{
"offset" : 30,
"value" : "Victoria"
},
{
"offset" : 40,
"value" : "Australia"
}
],
"types" : [ "route", "geocode" ]
}
以下是上述自动完成地址的谷歌地图地理代码API的输出
{
results = (
{
"address_components" = (
{
"long_name" = "Spring Lane";
"short_name" = "Spring Ln";
types = (
route
);
},
{
"long_name" = Wallacedale;
"short_name" = Wallacedale;
types = (
locality,
political
);
},
{
"long_name" = Victoria;
"short_name" = VIC;
types = (
"administrative_area_level_1",
political
);
},
{
"long_name" = Australia;
"short_name" = AU;
types = (
country,
political
);
},
{
"long_name" = 3303;
"short_name" = 3303;
types = (
"postal_code"
);
}
);
"formatted_address" = "Spring Lane, Wallacedale VIC 3303, Australia";
geometry = {
bounds = {
northeast = {
lat = "-37.9132082";
lng = "141.8506572";
};
southwest = {
lat = "-37.9283224";
lng = "141.8505337";
};
};
location = {
lat = "-37.9266631";
lng = "141.8506572";
};
"location_type" = "GEOMETRIC_CENTER";
viewport = {
northeast = {
lat = "-37.9132082";
lng = "141.8519444302915";
};
southwest = {
lat = "-37.9283224";
lng = "141.8492464697085";
};
};
};
"partial_match" = 1;
"place_id" = "ChIJV74lHNPCzGoRnS8t_EDR8zk";
types = (
route
);
}
);
status = OK;
}
输出没有组件类型"街道编号",作为自动完成的地址字符串,它的开头是正确的。这种情况发生在许多地址上,可能出了什么问题?还是我需要使用其他服务?具有街道编号的地址示例低于
这是通过自动完成API 返回的
{
"description" : "11 Victoria Parade, Collingwood, Victoria, Australia",
"id" : "dbeebdb81c8babd166ac8f89878e88c2cba333a1",
"matched_substrings" : [
{
"length" : 18,
"offset" : 0
},
{
"length" : 9,
"offset" : 43
}
],
"place_id" : "EjQxMSBWaWN0b3JpYSBQYXJhZGUsIENvbGxpbmd3b29kLCBWaWN0b3JpYSwgQXVzdHJhbGlh",
"reference" : "CkQ4AAAATy4Z7xc3ermqeWnlxpl81pAVsBWOIl3S2JbCwwRxraLt39OJauWFnCR3NgGyruVBXfUo236mMe6CCQt5XRSYwRIQEL8JC7Qo8j3-0iD4AnJTtBoURjzgm8aHBa2g0tY4lkTKYTuVGPg",
"terms" : [
{
"offset" : 0,
"value" : "11 Victoria Parade"
},
{
"offset" : 20,
"value" : "Collingwood"
},
{
"offset" : 33,
"value" : "Victoria"
},
{
"offset" : 43,
"value" : "Australia"
}
],
"types" : [ "route", "geocode" ]
}
下面是Geocode服务在发送自动完成的地址作为输入后返回的结果
results = (
{
"address_components" = (
{
"long_name" = 11;
"short_name" = 11;
types = (
"street_number"
);
},
{
"long_name" = "Victoria Parade";
"short_name" = "Victoria Parade";
types = (
route
);
},
{
"long_name" = Collingwood;
"short_name" = Collingwood;
types = (
locality,
political
);
},
{
"long_name" = Victoria;
"short_name" = VIC;
types = (
"administrative_area_level_1",
political
);
},
{
"long_name" = Australia;
"short_name" = AU;
types = (
country,
political
);
},
{
"long_name" = 3066;
"short_name" = 3066;
types = (
"postal_code"
);
}
);
"formatted_address" = "11 Victoria Parade, Collingwood VIC 3066, Australia";
geometry = {
bounds = {
northeast = {
lat = "-37.8087633";
lng = "144.9830508";
};
southwest = {
lat = "-37.8087778";
lng = "144.9830487";
};
};
location = {
lat = "-37.8087633";
lng = "144.9830508";
};
"location_type" = "RANGE_INTERPOLATED";
viewport = {
northeast = {
lat = "-37.8074215697085";
lng = "144.9843987302915";
};
southwest = {
lat = "-37.8101195302915";
lng = "144.9817007697085";
};
};
};
"place_id" = EjMxMSBWaWN0b3JpYSBQYXJhZGUsIENvbGxpbmd3b29kIFZJQyAzMDY2LCBBdXN0cmFsaWE;
types = (
"street_address"
);
}
);
status = OK;
}
如有任何帮助,我们将不胜感激。
自动完成结果在描述中得到的只是一个字符串,仅此而已(不是一组功能,如街道、邮政编码或门牌号)。服务尝试(根据输入)找到确切的位置,但匹配可能是部分匹配。
例如,当您在澳大利亚维多利亚州瓦拉切代尔斯普林巷740号键入时http://maps.google.com您将获得Spring Ln,Wallacedale VIC 3303,Australia的结果
您也可以键入12345 Spring Lane,Wallacedale,Victoria,Australia,您会得到相同的结果。
除此之外:我建议根据place_id
请求位置详细信息。虽然它不能给你想要的结果(门牌号),但结果应该更准确(绑定到特定的地方,而不是一个地方的地址)。它还将返回该地点的更多详细信息。