Skip to content

Instantly share code, notes, and snippets.

@013231
Created July 22, 2015 08:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 013231/8c681e75ee1fbc380731 to your computer and use it in GitHub Desktop.
Save 013231/8c681e75ee1fbc380731 to your computer and use it in GitHub Desktop.
#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;
}
@013231
Copy link
Author

013231 commented Jul 22, 2015

Output:

长江南路站 浦东机场 45153
长江南路站 起点单车世纪公园店 21041
长江南路站 南汇嘴观海公园 84626
长江南路站 东方明珠 12198
长江南路站 虹桥火车站 29831
长江南路站 复旦大学江湾校区 地址不明确
浦东机场 起点单车世纪公园店 36303
浦东机场 南汇嘴观海公园 49822
浦东机场 东方明珠 42674
浦东机场 虹桥火车站 59153
浦东机场 复旦大学江湾校区 地址不明确
起点单车世纪公园店 南汇嘴观海公园 70303
起点单车世纪公园店 东方明珠 5663
起点单车世纪公园店 虹桥火车站 29903
起点单车世纪公园店 复旦大学江湾校区 地址不明确
南汇嘴观海公园 东方明珠 76201
南汇嘴观海公园 虹桥火车站 90772
南汇嘴观海公园 复旦大学江湾校区 地址不明确
东方明珠 虹桥火车站 23533
东方明珠 复旦大学江湾校区 地址不明确
虹桥火车站 复旦大学江湾校区 地址不明确

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment