文档章节

Erlang 根据经纬度从百度地图分析出地理名称保存到mysql

yunnet
 yunnet
发布于 2013/10/12 15:15
字数 764
阅读 279
收藏 0

一、erlang中使用mysql客户端

   使用git获取,https://github.com/dizzyd/erlang-mysql-driver.git

二、common.hrl定义

%%%------------------------------------------------
%%% File    : common.hrl
%%% Author  : yunnet
%%% Created : 2013-08-14
%%% Description: 公共定义
%%%------------------------------------------------

%%数据库连接
-define(DB, mysql_conn_poll).
-define(DB_HOST, "127.0.0.1").
-define(DB_PORT, 3306).
-define(DB_USER, "root").
-define(DB_PASS, "root").
-define(DB_NAME, "track").
-define(DB_ENCODE, utf8).


-define(C_TUSER_SQL, "create table tUser (id int not null auto_increment, sUsername varchar(50) not null,sPassword varchar(20) not null, nSex int null, primary key (id)) engine = myisam").
-define(C_TUSER_NAME, "tUser").

三、mysqlLib.erl简单封装

%%%------------------------------------------------
%%% File    : mysql_test.erl
%%% Author  : yunnet
%%% Created : 2013-08-14
%%% Description: mysql测试单元
%%%------------------------------------------------

-module(mysql_lib).
-compile(export_all).
-include("common.hrl").


printf(_Data) ->
    io:format("this is test data: ~p~n", [_Data]).

connect()->
    mysql:start_link(?DB, ?DB_HOST, ?DB_PORT, ?DB_USER, ?DB_PASS, ?DB_NAME, fun(_, _, _, _) -> ok end, ?DB_ENCODE),
    Result = mysql:connect(?DB, ?DB_HOST, ?DB_PORT, ?DB_USER, ?DB_PASS, ?DB_NAME, ?DB_ENCODE, true),   
	case Result of
	  {ok, ConnPid} -> ok;
	  {error, Reason} -> error
	end,
    ok.
	  
createTable(_Table, _SQLText)->
	mysql:fetch(?DB, io_lib:format(<<"drop table if exists '~s'">>, [_Table])),
	mysql:fetch(?DB, io_lib:format(<<"'~s'">>, [_SQLText])),
    %%mysql:fetch(?DB, <<"create table tUser (id int not null auto_increment, sUsername varchar(50) not null,sPassword varchar(20) not null, nSex int null, primary key (id)) engine = myisam">>),
	ok.
	
%%增加用户信息	
addUser(_User, _Password, _Sex) ->
  Sql_Text = io_lib:format(<<"insert into tUser (sUsername, sPassword, nSex) values ('~s','~s',~p)">>, [_User, _Password, _Sex]), 
  A = list_to_binary(Sql_Text),
  io:format("~p~n", [A]),  
  executeSQL(?DB, Sql_Text),
  ok.
 
%%增加地理信息
addGpsDesc(_Content) ->
    io:format("address: ~ts~n", [list_to_binary([_Content])]),	
    Sql_Text = io_lib:format(<<"insert into gps_desc(sXmlContent) values('~ts')">>, [unicode:characters_to_list([_Content])]),
    io:format("Sql_Text: ~ts~n", [list_to_binary(Sql_Text)]),
    executeSQL(?DB, Sql_Text),
    ok.
    

%%写入数据库 
%%_SqlText=sql语句, _DB=连接原子名称
executeSQL(_DB, _SqlText)->
	mysql:fetch(_DB, _SqlText).

%%读数据库 
%%_SqlText=sql语句, _DB=连接原子名称
%%返回查询数据列表
executeQuery(_DB, _SqlText)->
	case mysql:fetch(_DB, _SqlText) of
			{data, MySQLRes}-> case mysql:get_result_rows(MySQLRes) of
							  []->[];
							  List->List
							  end;
		_->[]
	end.

四、获取地理信息

-module(takeUrl). 

-import(lists, [reverse/1]).
-import(html_util, [escape/1, unescape/1]).
-include_lib("xmerl/include/xmerl.hrl").

-compile(export_all).

-record(xmlResponse, {
    lat,
	lng,
	address,
	business,
	streetNumber,
	street,
	district,
	city,
	province,
	cityCode	   
	}).

start() ->
    ok = http_start(),    
    ok = mysql_start().
   

%% inets start
http_start() ->
    ok = inets:start(),
     io:format("inets start ok.~n").

%% mysql start 
mysql_start() ->
    ok = mysql_lib:connect(),
    io: format("mysql connect ok.~n").
    
  
stop() ->
  ok = inets:stop().

%%取横坐标  
main() ->
    for(23107237, 23107347, fun(I) -> vertical(I) end),
    ok.

%%取竖坐标	
vertical(I) ->
    for(113269804, 113269914, fun(A) -> get_http(I/1000000, A/1000000) end), 
    ok.  
	
%% 根据URL获取内容
get_http(_Lat, _Lng) ->   
   Url = io_lib:format("http://api.map.baidu.com/geocoder?output=xml&location=~f,%20~f&key=37492c0ee6f924cb5e934fa08c6b1676", [_Lat, _Lng]),
   {ok, Response} = get_Result(Url),
   {ok, Address} = parseXml(Response),
   mysql_lib:addGpsDesc(Address).	
    
	
%% 根据获取的内容保存到文件
get_Result(_Url) -> 
  {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} = httpc:request(get, {_Url, []}, [], []),
  {ok, Body}.
%%  io:format("Version:~p~n ReasonPhrase:~p~n Headers:~p~n Body: ~p~n", [Version, ReasonPhrase, Headers, Body]),


%% @doc Parses Response data.
parseXml(_Response) ->
    Fixed = fix_unicode(_Response),
    {Doc, _} = xmerl_scan:string(Fixed), 
		
    [LatNode] = xmerl_xpath:string("//lat", Doc),     %% 查找唯一节点
    [LatContent] = LatNode#xmlElement.content,
    #xmlResponse.lat = string:to_float(LatContent#xmlText.value),
	
    [LngNode] = xmerl_xpath:string("//Lng", Doc),
    [LngContent] = LngNode#xmlElement.content,
    #xmlResponse.lng = string:to_float(LngContent#xmlText.value),
	
    [AddressNode] = xmerl_xpath:string("//formatted_address", Doc),
    [AddressContent] = AddressNode#xmlElement.content,
    #xmlResponse.address = AddressContent#xmlText.value,
	
    [BusinessNode] = xmerl_xpath:string("//business", Doc),
    [BusinessContent] = BusinessNode#xmlElement.content,
    #xmlResponse.business = BusinessContent#xmlText.value,
	
    [CityCodeNode] = xmerl_xpath:string("//cityCode", Doc),
    [CityCodeContent] = CityCodeNode#xmlElement.content,
    #xmlResponse.cityCode = string:to_integer(CityCodeContent#xmlText.value),    

   
    %%得到节点
%%    [Element1] = xmerl_xpath:string("/GeocoderSearchResponse/result/formatted_address", Doc),
%%    [XmlContent1] = Element1#xmlElement.content,
%%    Formatted_address = XmlContent1#xmlText.value,
%%    #xmlResponse.address = Formatted_address,   

    {ok, #xmlResponse.address}.
     

%% @doc Parses an indiviual element into a proplist. This isn't a generic approach.
parse_element(Node, Doc) ->
	[
		{Element, Value} ||
		#xmlElement{content = XmlElem} <- xmerl_xpath:string(Node, Doc),
		#xmlElement{name = Element, attributes = Attributes} <- XmlElem,
		#xmlAttribute{name = data, value = Value} <- Attributes
	].


%% @doc fixes problems with xmerl and unicode
fix_unicode(XmlString) -> 
        Binary = unicode:characters_to_binary(XmlString, unicode), 
        binary_to_list(Binary).


  
for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I) | for(I + 1, Max, F)].

© 著作权归作者所有

共有 人打赏支持
yunnet
粉丝 9
博文 29
码字总数 23537
作品 2
广州
私信 提问
百度地图资源下载备注

http://developer.baidu.com/map/devRes.htm 相关下载 名称 说明 下载 百度地图城市名称-中心点经纬度(cityCenter)关系对照 您可以通过此文件获知百度地图的全国各城市中心点(cityCenter)...

宝塔镇河妖
2016/09/04
38
0
百度地图桌面程序源码,CatchPacket网络抓包软件

百度地图桌面程序源码,CatchPacket网络抓包软件 Extjs c# asp.net 兼职 qq:2294508843 百度地图桌面程序源码 功能介绍: 1.根据ip定位地理位置信息,ip网段,isp提供商,ip地理位置 2.根据i...

acer
2014/11/03
253
1
关于Google Maps的地图类型(MapType)的一些心得

在Google Maps之中地图类型(MapType)是一个比较复杂的类,可是在Google Maps API说明之中却没有比较明确的说明,我将我对API分析之后的一些心得写出来,供大家参考。 每一个地图类型首先是一...

zhengguogaun
2013/06/19
0
0
手把手教你完成一个数据科学小项目(7):经纬度获取与BDP可视化

前言 请先阅读“中国年轻人正带领国家走向危机”,这锅背是不背? 一文,以对“手把手教你完成一个数据科学小项目”系列有个全局性的了解。 本系列代码统一开源在GitHub:DesertsX/gulius-p...

古柳_Deserts_X
08/25
0
0
【高德地图API】如何解决坐标转换,坐标偏移?

一、坐标体系 首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任...

hejunbinlan
2015/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sql 开窗函数

开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数...

hblt-j
16分钟前
0
0
使用Vue动态生成form表单的实例代码

具有数据收集、校验和提交功能的表单生成器,包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传功能,支持事件扩展。 欢迎大家s...

嫣然丫丫丫
24分钟前
0
0
NEO区块链-DAPP开发直通车-第零篇

什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称。 NEL将为开发DAPP提供全面的服务 什么是NEL NEL是 “NewEcon...

NEO-FANS
27分钟前
1
0
可视化软件VisIt在Ubuntu18.04上的安装

可视化软件VisIt在Ubuntu18.04上的安装 参考文档及使用说明 1.下载 在官网下载页面下载合适版本的安装文件,Ubuntu有专用的 https://wci.llnl.gov/simulation/computer-codes/visit/executa...

佚文
33分钟前
1
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部