c#獲取中國三級行政區域劃分(省市縣)以及縣級經緯度demo
阿新 • • 發佈:2019-01-31
1 定義三級model
[XmlRoot("country")]
public class Country
{
[XmlElement("provinces")]
public List<Province> provinces { get; set; }
[XmlAttribute]
public string name { get; set; }
}
public class Province
{
[XmlElement("city")]
public List<City> citys { get; set; }
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public string code { get; set; }
}
public class City
{
[XmlElement("county")]
public List<County> Counties { get; set; }
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public string code { get; set; }
}
public class County
{
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public string code { get; set; }
/// <summary>
/// 經度
/// </summary>
[XmlAttribute]
public double longitude { get; set; }
/// <summary>
/// 維度
/// </summary>
[XmlAttribute]
public double latitude { get; set; }
}
2 線上獲取行政區域劃分
string url = "http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html"; string html = CoordinateHelper.HttpHelper(url);
string str = Regex.Match(html, "<div class=\"xilan_con\".*?</div>").ToString();
MatchCollection matches = Regex.Matches(str, "<p.*?>(\\d+).*?</p>");
List<Province> list = new List<Province>();
foreach (Match match in matches)
{
//<p class="MsoNormal" align="justify">110000 北京市</p>
var group = match.Groups[1];
string code = group.Value;
string name = Regex.Replace(match.ToString(), "<.*?>", "");
name = Regex.Replace(name, " ", "");
name = Regex.Replace(name, code, "");
name = name.Trim();
if (code.EndsWith("00"))
{
var temp = list.FirstOrDefault(p => p.code.StartsWith(code.Substring(0, 2)));
if (temp == null)
{
Province province = new Province();
province.code = code;
province.name = name;
province.citys = new List<City>();
list.Add(province);
}
else
{
string sbustr = code.Substring(0, 2);
Province province = list.FirstOrDefault(p => p.code.StartsWith(sbustr));
if (province != null)
{
City city = new City()
{
name = name,
code = code,
Counties = new List<County>()
};
province.citys.Add(city);
}
continue;
}
}
else
{
string sbustr = code.Substring(0, 2);
Province province = list.FirstOrDefault(p => p.code.StartsWith(sbustr));
if (province != null)
{
City city = province.citys.FirstOrDefault(p => p.code.StartsWith(code.Substring(0, 4)));
if (city != null)
{
County coun = new County()
{
name = name,
code = code
};
city.Counties.Add(coun);
}
}
}
}
Country country = new Country()
{
name = "中國",
provinces = list
};
3 獲取經緯度(縣級)
await Task.Run(() =>
{
foreach (var province in country.provinces)
{
App.Current.Dispatcher.Invoke(() =>
{
this.txtPro.Text = province.name;
});
foreach (var city in province.citys)
{
App.Current.Dispatcher.Invoke(() =>
{
this.txtCity.Text = city.name;
});
foreach (var county in city.Counties)
{
App.Current.Dispatcher.Invoke(() =>
{
this.txtCounty.Text = county.name;
});
` Tuple<string, string> item = CoordinateHelper.GetLocation(province.name + city.name + county.name);`
if (item != null)
{
if (string.IsNullOrEmpty(item.Item1) || string.IsNullOrEmpty(item.Item2))
{
item = CoordinateHelper.GetLocation(province.name + city.name);
//if (string.IsNullOrEmpty(item.Item1) || string.IsNullOrEmpty(item.Item2))
//{
// item = CoordinateHelper.GetLocation(province.name);
//}
}
try
{
county.latitude = Convert.ToDouble(item.Item1);
}
catch
{
App.Current.Dispatcher.Invoke(() =>
{
this.txt.Text = this.txt.Text + " " + province.name + city.name + county.name;
});
county.latitude = 0.0;
}
try
{
county.longitude = Convert.ToDouble(item.Item2);
}
catch
{
county.longitude = 0.0;
}
}
}
}
}
});
public class CoordinateHelper
{
//{"status":0,"result":{"location":{"lng":116.23967780102,"lat":40.033162045078},"precise":0,"confidence":16,"level":"\u533a\u53bf"}}
/// <summary>
/// construct geo given name of a place
/// </summary>
/// <param name="location"></param>
public static Tuple<string, string> GetLocation(string location)
{
srring ak="自己的金鑰";
string latitude;
string longtitude;
location = HttpUtility.UrlEncode(location);
string url = "http://api.map.baidu.com/geocoder/v2/?address=" + location + "&output=json&ak="+ak;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string temp = sr.ReadToEnd();
Match match = Regex.Match(temp, "\"location\":{\"lng\":(.*?),\"lat\":(.*?)},\"");
longtitude = match.Groups[1].ToString();
latitude = match.Groups[2].ToString();
}
return new Tuple<string, string>(latitude, longtitude);
}
public static string HttpHelper(string url)
{
string html = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
html = sr.ReadToEnd();
}
return html;
}
}
4 把生成的實體序列化為josn或者xml
string jsonStr = JsonConvert.SerializeObject(country, Newtonsoft.Json.Formatting.Indented);
File.WriteAllText("d:\\china.json", jsonStr);
XMLSerializeHelper.SerializeToFile(country, "d:\\china.xml");
5 xml序列化類
public class XMLSerializeHelper
{
/// <summary>
/// 序列化到檔案
/// </summary>
public static void SerializeToFile(object obj, string filename)
{
string path = filename.Substring(0, filename.LastIndexOf(@"\"));
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
using (FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
XmlSerializer x = new XmlSerializer(obj.GetType());
try
{
x.Serialize(stream, obj);
}
catch (Exception ex)
{
throw;
}
}
}
/// <summary>
/// 從檔案返序列化
/// </summary>
public static T DeserializeFromFile<T>(string path)
{
XmlSerializer x = new XmlSerializer(typeof(T));
StreamReader reader = null;
try
{
reader = new StreamReader(path);
return (T)x.Deserialize(reader);
}
catch (Exception ex)
{
throw;
}
finally
{
reader.Close();
reader.Dispose();
}
}
/// <summary>
/// 從XML字串中反序列化物件
/// </summary>
/// <typeparam name="T">結果物件型別</typeparam>
/// <param name="s">包含物件的XML字串</param>
/// <param name="encoding">編碼方式</param>
/// <returns>反序列化得到的物件</returns>
public static T XmlDeserialize<T>(string s, Encoding encoding)
{
if (string.IsNullOrEmpty(s))
{
throw new ArgumentNullException("反序列化字串為空!");
}
if (encoding == null)
{
throw new ArgumentNullException("序列化編碼為空!");
}
XmlSerializer mySerializer = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
{
using (StreamReader sr = new StreamReader(ms, encoding))
{
return (T)mySerializer.Deserialize(sr);
}
}
}
/// <summary>
/// 將一個物件序列化為XML字串
/// </summary>
/// <param name="obj">要序列化的物件</param>
/// <param name="encoding">編碼方式</param>
/// <returns>序列化產生的XML字串</returns>
public static string XmlSerialize(object obj, Encoding encoding)
{
if (obj == null)
{
throw new ArgumentNullException("序列化實體為空!");
}
if (encoding == null)
{
throw new ArgumentNullException("序列化編碼為空!");
}
using (MemoryStream stream = new MemoryStream())
{
XmlSerializeInternal(stream, obj, encoding);
stream.Position = 0;
using (StreamReader reader = new StreamReader(stream, encoding))
{
return reader.ReadToEnd();
}
}
}
private static void XmlSerializeInternal(Stream stream, object obj, Encoding encoding)
{
if (obj == null)
{
throw new ArgumentNullException("序列化實體為空!");
}
if (encoding == null)
{
throw new ArgumentNullException("序列化編碼為空!");
}
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineChars = "\r\n";
settings.Encoding = encoding;
settings.IndentChars = " ";
using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, obj);
}
}
}
6 原始碼下載
在本站搜尋。。