Created
July 22, 2015 08:45
-
-
Save 013231/8c681e75ee1fbc380731 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <curl/curl.h> | |
#include <yajl/yajl_tree.h> | |
#include <yajl/yajl_common.h> | |
#define LOC_NUM 7 | |
#define JSON_ERR_MSG_LEN 1024 | |
const char *locs[LOC_NUM] = { | |
"长江南路站", | |
"浦东机场", | |
"起点单车世纪公园店", | |
"南汇嘴观海公园", | |
"东方明珠", | |
"虹桥火车站", | |
"复旦大学江湾校区", | |
}; | |
struct Loc_pair { | |
const char *ori; | |
const char *dst; | |
}; | |
struct Buffer { | |
char *data; | |
size_t size; | |
}; | |
struct Loc_pair * make_loc_pairs(const char *locs[], const size_t loc_num) { | |
size_t res_size = sizeof(struct Loc_pair) * LOC_NUM * (LOC_NUM - 1) / 2; | |
struct Loc_pair *res = (struct Loc_pair *)malloc(res_size); | |
if (res) { | |
for (size_t i = 0; i < loc_num; ++i) { | |
for (size_t j = i + 1; j < loc_num; ++j) { | |
size_t idx = i * (-i + 2 * loc_num - 1) / 2 + j - i - 1; | |
res[idx].ori = locs[i]; | |
res[idx].dst = locs[j]; | |
} | |
} | |
} | |
return res; | |
} | |
char * make_url(const char *ori, const char *dst) { | |
const char *template = "http://api.map.baidu.com/direction/v1?" | |
"origin=%s&destination=%s&" | |
"origin_region=上海&destination_region=上海&output=json&" | |
"ak=FiEvtaywX9cZpW1LdWAf14UM"; | |
char *res = 0; | |
asprintf(&res, template, ori, dst); | |
return res; | |
} | |
size_t req_callback( | |
const char* contents, | |
size_t size, | |
size_t nmemb, | |
struct Buffer* buffer) { | |
size_t real_size = size * nmemb; | |
buffer->data = realloc(buffer->data, buffer->size + real_size + 1); | |
if (buffer->data) { | |
memcpy(buffer->data + buffer->size, contents, real_size); | |
buffer->size += real_size; | |
buffer->data[buffer->size] = 0; | |
return real_size; | |
} else { | |
return 0; | |
} | |
} | |
char * get_resp_txt(const char *url) { | |
curl_global_init(CURL_GLOBAL_ALL); | |
CURL *curl_handle = curl_easy_init(); | |
struct Buffer buffer; | |
buffer.data = malloc(1); | |
buffer.size = 0; | |
if (curl_handle) { | |
curl_easy_setopt(curl_handle, CURLOPT_URL, url); | |
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, req_callback); | |
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &buffer); | |
curl_easy_perform(curl_handle); | |
} | |
curl_easy_cleanup(curl_handle); | |
curl_global_cleanup(); | |
return buffer.data; | |
} | |
int get_distance(const char *ori, const char *dst) { | |
char *url = make_url(ori, dst); | |
char *resp = get_resp_txt(url); | |
free(url); | |
char j_err_msg[JSON_ERR_MSG_LEN]; | |
yajl_val root = yajl_tree_parse(resp, j_err_msg, JSON_ERR_MSG_LEN); | |
free(resp); | |
unsigned int res = 0; | |
const char *type_path[] = {"type", (const char *)0}; | |
unsigned char type = YAJL_GET_INTEGER( | |
yajl_tree_get(root, type_path, yajl_t_number)); | |
if (type == 2) { | |
const char *routes_path[] = {"result", "routes", (const char *)0}; | |
yajl_val *routes = YAJL_GET_ARRAY( | |
yajl_tree_get(root, routes_path, yajl_t_array))->values; | |
yajl_val first_route = routes[0]; | |
const char *distance_path[] = {"distance", (const char *)0}; | |
res = YAJL_GET_INTEGER( | |
yajl_tree_get(first_route, distance_path, yajl_t_number)); | |
} | |
yajl_tree_free(root); | |
return res; | |
} | |
int main() { | |
struct Loc_pair *loc_pairs = make_loc_pairs(locs, LOC_NUM); | |
if (loc_pairs) { | |
for (size_t i = 0; i < LOC_NUM * (LOC_NUM - 1) / 2; ++i) { | |
const char *ori = loc_pairs[i].ori; | |
const char *dst = loc_pairs[i].dst; | |
int d = get_distance(ori, dst); | |
if (d) { | |
printf("%s\t%s\t%d\n", ori, dst, d); | |
} else { | |
printf("%s\t%s\t地址不明确\n", ori, dst); | |
} | |
} | |
free(loc_pairs); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output:
长江南路站 浦东机场 45153
长江南路站 起点单车世纪公园店 21041
长江南路站 南汇嘴观海公园 84626
长江南路站 东方明珠 12198
长江南路站 虹桥火车站 29831
长江南路站 复旦大学江湾校区 地址不明确
浦东机场 起点单车世纪公园店 36303
浦东机场 南汇嘴观海公园 49822
浦东机场 东方明珠 42674
浦东机场 虹桥火车站 59153
浦东机场 复旦大学江湾校区 地址不明确
起点单车世纪公园店 南汇嘴观海公园 70303
起点单车世纪公园店 东方明珠 5663
起点单车世纪公园店 虹桥火车站 29903
起点单车世纪公园店 复旦大学江湾校区 地址不明确
南汇嘴观海公园 东方明珠 76201
南汇嘴观海公园 虹桥火车站 90772
南汇嘴观海公园 复旦大学江湾校区 地址不明确
东方明珠 虹桥火车站 23533
东方明珠 复旦大学江湾校区 地址不明确
虹桥火车站 复旦大学江湾校区 地址不明确