奔跑的小河
Talk is cheap. Show me the code.

导航

 

今天根据需求要从百度API中取出一些数据,这些操作包括:将坐标转换成百度坐标,根据转换的百度坐标进行特定的查询。

有需求的收藏下,免得下次手写浪费时间。

涉及到的操作有:JSON格式的字符解析,HTTP请求和获得请求数据,文件流的写入和读出等等。

奉上源代码,共享:

首先是入口函数:

static void Main(string[] args)
        {
            Console.WriteLine("坐标转换,信息查询开始......");
            string oFile = "C:\\Users\\MisterHu\\Desktop\\点加属性\\聚类点.txt";
            string iFile = "C:\\Users\\MisterHu\\Desktop\\点加属性\\result.txt";

            List<string> tCoords = new List<string>();//存转换前坐标
            List<string> cvtCoords = new List<string>();//存转换后坐标
            List<string> rstQuery = new List<string>();//存查询结果

            string sInfo; //临时字符变量
            StreamReader sr = new StreamReader(oFile, Encoding.Default);
            while ((sInfo = sr.ReadLine()) != null)
            {
                tCoords.Add(sInfo.Substring(sInfo.IndexOf(',')+1));
            }
            sr.Close();

            //转换成百度坐标,然后存放到List中
            BaiDuAPI.CoordConvert(tCoords, cvtCoords);

            //从List中取出每个坐标,然后调用API
            BaiDuAPI.PlaceAPI(cvtCoords, rstQuery);

            //写入文件。
            String strLine = null;         
            for (int i = 1; i <= 1000;++i )
            {
                strLine += i.ToString() + "," + tCoords[i - 1] + rstQuery[i - 1] + "\r\n";           
            }

            FileStream.WriteInFile(strLine, iFile);
            Console.WriteLine("转换,获取,完成!");
        }

字符串输入输出到文件:

 //输入输出字符到文件中
    public static class FileStream
    {
        public static void ReadFormFile(string path)
        {

        }

        public static void WriteInFile(string content,string path)
        {
            string iFile = "D:\\temp.txt";
            if (path == null) path = iFile;
            
            StreamWriter sw = new StreamWriter(path);
            sw.Write(content);
            sw.Flush();
            sw.Close();
        }
    }
核心类,仔细看,根据自己的需求可以做适当的修改:

//处理API请求
    public static class BaiDuAPI
    {
        public static void CoordConvert(List<string> src,List<string> des)
        {
            StringBuilder RequestURL = new StringBuilder();
            StringBuilder coordStr = new StringBuilder();
            string arg1 = "http://api.map.baidu.com/geoconv/v1/?coords=";
            string arg2 = "&from=1&to=5&ak=IC96AbO521APtmpsaR9xCMqo";

            string result = null;
            int count = src.Count;

            for (int i = 0; i < count; ++i)
            {
                if ((i+1)%100 != 0 && i != count - 1) //将100个数据加进去
                {
                    coordStr.Append(src[i]);
                    coordStr.Append(";");
                    continue;
                }
                else if ((i + 1) % 100 == 0 || i == count - 1) //处理不足100个数据和第100个数据
                {
                   coordStr.Append(src[i]);
                }

                RequestURL.Append(arg1);
                RequestURL.Append(coordStr);
                RequestURL.Append(arg2);
                result = HttpGet(RequestURL.ToString());
                
                //处理返回的结果
                DoJsonCoords(result,des);

                result = null;
                RequestURL.Clear();
                coordStr.Clear();
            }
             
        }

        public static void DoJsonCoords(string result, List<string> des)
        {
            if (result == "" || result == null) return;

            JsonCoord jsonCoord = JSON.ParseJson<JsonCoord>(result);
            
            List<Coord> coord = jsonCoord.result;
            string temp = null;
            foreach (Coord crd in coord)
            {
                temp = crd.y.ToString() + "," + crd.x.ToString();
                des.Add(temp);
            }
        }

        /// <summary>
        /// 返回结果字符串
        /// </summary>
        public static void PlaceAPI(List<string> des,List<string> rst)
        {
            //购物//教育//景点//企业//小区
            List<string> query = new List<string>{ "购物", "教育","景点","企业", "小区"};
            StringBuilder RequestURL = new StringBuilder();
            StringBuilder tempQuery = new StringBuilder();
            string arg1 = "http://api.map.baidu.com/place/v2/search?ak=IC96AbO521APtmpsaR9xCMqo&output=json&query=";
            string arg2 = "&page_size=1&page_num=0&scope=1&location=";
            string arg3 = "&radius=1000";

            string jsonResult = null;
            string tStr = null;
            int num;
            foreach (string str in des)
            {
                for (int i = 0; i < 5;++i )
                {
                    tempQuery.Append(HttpUtility.UrlEncode(query[i]));
                    tempQuery.Append(arg2);
                    tempQuery.Append(str);
                    tempQuery.Append(arg3);

                    RequestURL.Append(arg1);
                    RequestURL.Append(tempQuery.ToString());

                    jsonResult = HttpGet(RequestURL.ToString());
                    num = DoJsonPlace(jsonResult);
                    tStr += "," + query[i] + num.ToString();

                    tempQuery.Clear();
                    RequestURL.Clear();
                }
                rst.Add(tStr);
                Console.WriteLine(tStr);
                tStr = null;
            }
        }

        public static int DoJsonPlace(string result)
        {
            if (result == "" || result == null) return -1;

            Place place = JSON.ParseJson<Place>(result);

            return place.total;
        }

        /// <summary>
        /// 通过url获取返回来的字符串
        /// </summary>
        private static string HttpGet(string requestURL)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL.ToString());
            request.Method = "GET";
            request.ServicePoint.Expect100Continue = false;
            request.Method = "GET";
            request.KeepAlive = true;
            request.UserAgent = ".NET Framework BsiDuAPI Client";
            request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException webEx)
            {
                if (webEx.Status == WebExceptionStatus.Timeout)
                {
                    response = null;
                }
                Console.WriteLine(webEx.Status.ToString());
            }

            if (response != null)
            {
                if (response.CharacterSet != null)
                {
                    Encoding encoding = Encoding.GetEncoding(response.CharacterSet);
                    return GetResponseAsString(response, encoding);
                }
                else
                {
                    return string.Empty;
                }
            }
            else
            {
                return string.Empty;
            }
        }

        private static string GetResponseAsString(HttpWebResponse response, Encoding encoding)
        {
            StringBuilder result = new StringBuilder();
            Stream stream = null;
            StreamReader reader = null;

            try
            {
                // 以字符流的方式读取HTTP响应
                stream = response.GetResponseStream();
                reader = new StreamReader(stream, encoding);

                // 每次读取不大于256个字符,并写入字符串
                char[] buffer = new char[256];
                int readBytes = 0;
                while ((readBytes = reader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    result.Append(buffer, 0, readBytes);
                }
            }
            catch (WebException webEx)
            {
                if (webEx.Status == WebExceptionStatus.Timeout)
                {
                    result = new StringBuilder();
                }
            }
            finally
            {
                // 释放资源
                if (reader != null) reader.Close();
                if (stream != null) stream.Close();
                if (response != null) response.Close();
            }

            return result.ToString();
        }
    }

解析Json的类,没什么好说的直接copy:

//Json解析
    public static class JSON
    {
        /// <summary>
        /// 将Json反序列化为T对象
        /// </summary>
        public static T ParseJson<T>(string jsonString)
        {
            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
            {
                return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
            }
        }

        /// <summary>
        /// 将对象序列化为Json
        /// </summary>
        public static string Stringify(object jsonObject)
        {
            using (var ms = new MemoryStream())
            {
                new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }
    }

    //序列化对象
    [DataContract]
    public class Coord
    {
        [DataMember]
        public float x {get;set;}

        [DataMember]
        public float y {get;set;}
    }

    [DataContract]
    public class JsonCoord
    {
        [DataMember]
        public int status { get; set; }

        [DataMember]
        public List<Coord> result { get; set; }
    }

    [DataContract]
    public class Place
    {
        [DataMember]
        public int status { get; set; }

        [DataMember]
        public string message { get; set; }

        [DataMember]
        public int total { get; set; }

        //结果没用,不获取。
        //[DataMember(IsRequired = false)]
        //public string results { get; set; }
    }

注意,序列化对象类的写法,值得提出的一点是当不需要某个节点时,可以不用写出来,就像results一样,因为我的需求根本不关心其中的内容。

最后,附上源代码文件:http://download.csdn.net/detail/z702143700/8777263






posted on 2015-06-05 21:34  奔跑的小河  阅读(411)  评论(0编辑  收藏  举报