位置信息类API调用的代码示例合集:中国省市区查询、经纬度地址转换、POI检索等...

以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务。

  1. 中国省市区查询:2017最新中国省市区地址
  2. 经纬度地址转换:经纬度地址相互转换
  3. POI检索:通过关键词查询在某个地区的POI信息,支持市级、区县级查询:比如在广州查询“银行”,接口将会输出所有银行的地理信息列表。
  4. 公交、地铁路线规划:公交、驾车、骑行、步行查询,返回json格式的检索数据。

API Shop(apishop.net)提供多达50款的常用第三方API,可以从github上下载代码示例合集:https://github.com/apishop/All-APIs

以上接口均包含PHP、Python、C#和Java等四种语言的代码示例,以 路线查询 API为例:

(1)基于PHP的 路线查询 API服务请求的代码示例

<?php
$method = "POST";
$url = "https://api.apishop.net/common/direction/queryRoutes";
$headers = NULL;
$params = array(
    "origin" => "", //起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    "destination" => "", //终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    "mode" => "", //导航模式,包括:driving(驾车)、walking(步行)、transit(公交)、riding(骑行),默认为transit
    "region" => "", //所在城市,公交、步行导航时该参数必填。
    "origin_region" => "", //起始点所在城市,驾车导航时必填。
    "destination_region" => "", //终点所在城市,驾车导航时必填。
    "coord_type" => "", //坐标类型,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度摩卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。
    "ret_coordtype" => "", //可选,默认为百度经纬度坐标:bd09ll 可选值:  bd09ll:百度经纬度坐标  gcj02:国测局坐标
    "waypoints" => "", //途经点集合,包括一个或多个用竖线字符"|"分隔的地址名称或经纬度。支持驾车、步行方案,最多支持5个途经点。
    "tactics" => "", //导航策略,默认为12。可选值, 10:不走高速;  11:常规路线,即多数人常走的一条路线,不受路况影响,可用于用车估价;  12:距离较短,即距离相对较短的一条路线,但并不一定是一条优质路线;  13:躲避拥堵	
);

$result = apishop_curl($method, $url, $headers, $params);
If ($result) {
    $body = json_decode($result["body"], TRUE);
    $status_code = $body["statusCode"];
    If ($status_code == "000000") {
        //状态码为000000, 说明请求成功
        echo "请求成功:" . $result["body"];
    } else {
        //状态码非000000, 说明请求失败
        echo "请求失败:" . $result["body"];
    }
} else {
    //返回内容异常,发送请求失败,以下可根据业务逻辑自行修改
    echo "发送请求失败";
}

/**
 * 转发请求到目的主机
 * @param $method string 请求方法
 * @param $URL string 请求地址
 * @param null $headers 请求头
 * @param null $param 请求参数
 * @return array|bool
 */
function apishop_curl(&$method, &$URL, &$headers = NULL, &$param = NULL)
{
    // 初始化请求
    $require = curl_init($URL);
    // 判断是否HTTPS
    $isHttps = substr($URL, 0, 8) == "https://" ? TRUE : FALSE;
    // 设置请求方式
    switch ($method) {
        case "GET":
            curl_setopt($require, CURLOPT_CUSTOMREQUEST, "GET");
            break;
        case "POST":
            curl_setopt($require, CURLOPT_CUSTOMREQUEST, "POST");
            break;
        default:
            return FALSE;
    }
    if ($param) {
        curl_setopt($require, CURLOPT_POSTFIELDS, $param);
    }
    if ($isHttps) {
        // 跳过证书检查
        curl_setopt($require, CURLOPT_SSL_VERIFYPEER, FALSE);
        // 检查证书中是否设置域名
        curl_setopt($require, CURLOPT_SSL_VERIFYHOST, 2);
    }
    if ($headers) {
        // 设置请求头
        curl_setopt($require, CURLOPT_HTTPHEADER, $headers);
    }
    // 返回结果不直接输出
    curl_setopt($require, CURLOPT_RETURNTRANSFER, TRUE);
    // 重定向
    curl_setopt($require, CURLOPT_FOLLOWLOCATION, TRUE);
    // 把返回头包含再输出中
    curl_setopt($require, CURLOPT_HEADER, TRUE);
    // 发送请求
    $response = curl_exec($require);
    // 获取头部长度
    $headerSize = curl_getinfo($require, CURLINFO_HEADER_SIZE);
    // 关闭请求
    curl_close($require);
    if ($response) {
        // 返回头部字符串
        $header = substr($response, 0, $headerSize);
        // 返回体
        $body = substr($response, $headerSize);
        // 过滤隐藏非法字符
        $bodyTemp = json_encode(array(
            0 => $body
        ));
        $bodyTemp = str_replace("\ufeff", "", $bodyTemp);
        $bodyTemp = json_decode($bodyTemp, TRUE);
        $body = trim($bodyTemp[0]);
        // 将返回结果头部转成数组
        $respondHeaders = array();
        $header_rows = array_filter(explode(PHP_EOL, $header), "trim");
        foreach ($header_rows as $row) {
            $keylen = strpos($row, ":");
            if ($keylen) {
                $respondHeaders[] = array(
                    "key" => substr($row, 0, $keylen),
                    "value" => trim(substr($row, $keylen + 1))
                );
            }
        }
        return array(
            "headers" => $respondHeaders,
            "body" => $body
        );
    } else {
        return FALSE;
    }
}

(2)基于Python的 路线查询 API服务请求的代码示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试环境: python2.7
# 安装requests依赖 => pip install requests/ easy_install requests

# 导入requests依赖
import requests
import json
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

def apishop_send_request(method, url, params=None, headers=None):
    '''
    转发请求到目的主机
    @param method str 请求方法
    @param url str 请求地址
    @param params dict 请求参数
    @param headers dict 请求头
    '''
    method = str.upper(method)
    if method == 'POST':
        return requests.post(url=url, data=params, headers=headers)
    elif method == 'GET':
        return requests.get(url=url, params=params, headers=headers)
    else:
        return None

method = "POST"
url = "https://api.apishop.net/common/direction/queryRoutes"
headers = None
params = {			
    "origin":"", #起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    "destination":"", #终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    "mode":"", #导航模式,包括:driving(驾车)、walking(步行)、transit(公交)、riding(骑行),默认为transit
    "region":"", #所在城市,公交、步行导航时该参数必填。
    "origin_region":"", #起始点所在城市,驾车导航时必填。
    "destination_region":"", #终点所在城市,驾车导航时必填。
    "coord_type":"", #坐标类型,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度摩卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。
    "ret_coordtype":"", #可选,默认为百度经纬度坐标:bd09ll 可选值:  bd09ll:百度经纬度坐标  gcj02:国测局坐标
    "waypoints":"", #途经点集合,包括一个或多个用竖线字符"|"分隔的地址名称或经纬度。支持驾车、步行方案,最多支持5个途经点。
    "tactics":"", #导航策略,默认为12。可选值, 10:不走高速;  11:常规路线,即多数人常走的一条路线,不受路况影响,可用于用车估价;  12:距离较短,即距离相对较短的一条路线,但并不一定是一条优质路线;  13:躲避拥堵
}
result = apishop_send_request(method=method, url=url, params=params, headers=headers)
if result:
    body = result.text
    response = json.loads(body)
    status_code = response["statusCode"]
    if (status_code == '000000'):
        # 状态码为000000, 说明请求成功
        print('请求成功:%s' % (body,))
    else:
        # 状态码非000000, 说明请求失败
        print('请求失败: %s' % (body,))
else:
    # 返回内容异常,发送请求失败
    print('发送请求失败')

(3)基于C#的 路线查询 API服务请求的代码示例

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;

namespace apishop_sdk
{
class Program
{
    /**
     * 转发请求到目的主机
     * @param method string 请求方法
     * @param url string 请求地址
     * @param params Dictionary<string,string> 请求参数
     * @param headers Dictionary<string,string> 请求头
     * @return string
    **/
    static string apishop_send_request(string method, string url, Dictionary<string, string> param, Dictionary<string, string> headers)
    {
        string result = string.Empty;
        try
			{
				string paramData = "";
				if (param != null && param.Count > 0)
				{
					StringBuilder sbuilder = new StringBuilder();
					foreach (var item in param)
					{
						if (sbuilder.Length > 0)
						{
							sbuilder.Append("&");
						}
						sbuilder.Append(item.Key + "=" + item.Value);
					}
					paramData = sbuilder.ToString();
				}
				method = method.ToUpper();
				if (method == "GET")
				{
					url = string.Format("{0}?{1}", url, paramData);
				}
				HttpWebRequest wbRequest = (HttpWebRequest)WebRequest.Create(url);
				if (method == "GET")
				{
					wbRequest.Method = "GET";
				}
				else if (method == "POST")
				{
					wbRequest.Method = "POST";
					wbRequest.ContentType = "application/x-www-form-urlencoded";
					wbRequest.ContentLength = Encoding.UTF8.GetByteCount(paramData);
					using (Stream requestStream = wbRequest.GetRequestStream())
					{
						using (StreamWriter swrite = new StreamWriter(requestStream))
						{
							swrite.Write(paramData);
						}
					}
				}

				HttpWebResponse wbResponse = (HttpWebResponse)wbRequest.GetResponse();
				using (Stream responseStream = wbResponse.GetResponseStream())
				{
					using (StreamReader sread = new StreamReader(responseStream))
					{
						result = sread.ReadToEnd();
					}
				}
			}
			catch
			{
				return "";
			}
			return result;
		}
		class Response
		{
			public string statusCode;
		}
		static void Main(string[] args)
		{
			string method = "POST";
			string url = "https://api.apishop.net/common/direction/queryRoutes";
			Dictionary<string, string> param = new Dictionary<string, string>();			
            param.Add("origin", ""); //起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    param.Add("destination", ""); //终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    param.Add("mode", ""); //导航模式,包括:driving(驾车)、walking(步行)、transit(公交)、riding(骑行),默认为transit
    param.Add("region", ""); //所在城市,公交、步行导航时该参数必填。
    param.Add("origin_region", ""); //起始点所在城市,驾车导航时必填。
    param.Add("destination_region", ""); //终点所在城市,驾车导航时必填。
    param.Add("coord_type", ""); //坐标类型,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度摩卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。
    param.Add("ret_coordtype", ""); //可选,默认为百度经纬度坐标:bd09ll 可选值:  bd09ll:百度经纬度坐标  gcj02:国测局坐标
    param.Add("waypoints", ""); //途经点集合,包括一个或多个用竖线字符"|"分隔的地址名称或经纬度。支持驾车、步行方案,最多支持5个途经点。
    param.Add("tactics", ""); //导航策略,默认为12。可选值, 10:不走高速;  11:常规路线,即多数人常走的一条路线,不受路况影响,可用于用车估价;  12:距离较短,即距离相对较短的一条路线,但并不一定是一条优质路线;  13:躲避拥堵
		
			Dictionary<string, string> headers = null;
			string result = apishop_send_request(method, url, param, headers);
			if (result == "")
			{
				//返回内容异常,发送请求失败
				Console.WriteLine("发送请求失败");
				return;
			}

			Response res = new JavaScriptSerializer().Deserialize<Response>(result);
			if (res.statusCode == "000000")
			{
				//状态码为000000, 说明请求成功
				Console.WriteLine(string.Format("请求成功: {0}", result));
			}
			else
			{
				//状态码非000000, 说明请求失败
				Console.WriteLine(string.Format("请求失败: {0}", result));
			}
			Console.ReadLine();
		}
	}
}

(4)基于Java的 路线查询 API服务请求的代码示例

package net.apishop.www.controller;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;

/**
* httpUrlConnection访问远程接口工具
*/
public class Api
{
    /**
    * 方法体说明:向远程接口发起请求,返回字节流类型结果
    * param url 接口地址
    * param requestMethod 请求方式
    * param params 传递参数     重点:参数值需要用Base64进行转码
    * return InputStream 返回结果
    */
    public static InputStream httpRequestToStream(String url, String requestMethod, Map<String, String> params){
        InputStream is = null;
		try{
			String parameters = "";
			boolean hasParams = false;
			// 将参数集合拼接成特定格式,如name=zhangsan&age=24
			for (String key : params.keySet()){
				String value = URLEncoder.encode(params.get(key), "UTF-8");
				parameters += key + "=" + value + "&";
				hasParams = true;
			}
			if (hasParams){
				parameters = parameters.substring(0, parameters.length() - 1);
			}
			// 请求方式是否为get
			boolean isGet = "get".equalsIgnoreCase(requestMethod);
			// 请求方式是否为post
			boolean isPost = "post".equalsIgnoreCase(requestMethod);
			if (isGet){
				url += "?" + parameters;
			}
			URL u = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) u.openConnection();
			// 请求的参数类型(使用restlet框架时,为了兼容框架,必须设置Content-Type为“”空)
            conn.setRequestProperty("Content-Type", "application/octet-stream");
			//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			// 设置连接超时时间
			conn.setConnectTimeout(50000);
			// 设置读取返回内容超时时间
			conn.setReadTimeout(50000);
			// 设置向HttpURLConnection对象中输出,因为post方式将请求参数放在http正文内,因此需要设置为ture,默认false
			if (isPost){
				conn.setDoOutput(true);
			}
			// 设置从HttpURLConnection对象读入,默认为true
			conn.setDoInput(true);
			// 设置是否使用缓存,post方式不能使用缓存
			if (isPost){
				conn.setUseCaches(false);
			}
			// 设置请求方式,默认为GET
			conn.setRequestMethod(requestMethod);
			// post方式需要将传递的参数输出到conn对象中
			if (isPost){
				DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
				dos.writeBytes(parameters);
				dos.flush();
				dos.close();
			}
			// 从HttpURLConnection对象中读取响应的消息
			// 执行该语句时才正式发起请求
			is = conn.getInputStream();
		}catch(UnsupportedEncodingException e){
			e.printStackTrace();
		}catch(MalformedURLException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
		return is;
	}

	public static void main(String args[]){
		String url = "https://api.apishop.net/common/direction/queryRoutes";
		String requestMethod = "POST";
		Map<String, String> params = new HashMap<String, String>();			
		params.put("origin", ""); //起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    params.put("destination", ""); //终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。若为步行路径规划,则起终点间直线距离不应超过200公里。如“广州塔”、“广州塔|23.114155,113.318977”
    params.put("mode", ""); //导航模式,包括:driving(驾车)、walking(步行)、transit(公交)、riding(骑行),默认为transit
    params.put("region", ""); //所在城市,公交、步行导航时该参数必填。
    params.put("origin_region", ""); //起始点所在城市,驾车导航时必填。
    params.put("destination_region", ""); //终点所在城市,驾车导航时必填。
    params.put("coord_type", ""); //坐标类型,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度摩卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。
    params.put("ret_coordtype", ""); //可选,默认为百度经纬度坐标:bd09ll 可选值:  bd09ll:百度经纬度坐标  gcj02:国测局坐标
    params.put("waypoints", ""); //途经点集合,包括一个或多个用竖线字符"|"分隔的地址名称或经纬度。支持驾车、步行方案,最多支持5个途经点。
    params.put("tactics", ""); //导航策略,默认为12。可选值, 10:不走高速;  11:常规路线,即多数人常走的一条路线,不受路况影响,可用于用车估价;  12:距离较短,即距离相对较短的一条路线,但并不一定是一条优质路线;  13:躲避拥堵	
		String result = null;
		try{
            InputStream is = httpRequestToStream(url, requestMethod, params);
			byte[] b = new byte[is.available()];
			is.read(b);
			result = new String(b);
		}catch(IOException e){
		    e.printStackTrace();
		}
		if (result != null){
		    JSONObject jsonObject = JSONObject.parseObject(result);
		    String status_code = jsonObject.getString("statusCode");
		    if (status_code == "000000"){
                // 状态码为000000, 说明请求成功
                System.out.println("请求成功:" + jsonObject.getString("result"));
		    }else{
                // 状态码非000000, 说明请求失败
                System.out.println("请求失败:" + jsonObject.getString("desc"));
            }
        }else{
            // 返回内容异常,发送请求失败,以下可根据业务逻辑自行修改
            System.out.println("发送请求失败");
        }
    }
}

转载于:https://my.oschina.net/u/3784238/blog/1628892

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值