导航:
论坛 -> 文档资料
斑竹:liumazi,ruralboy
作者:
2014/10/15 20:49:52
标题:
XE7/QuickBurro下百度地图接口控件的升级改进
浏览:5687
加入我的收藏
楼主:
今年3月28日在AppMethod及XE5发布后的不久,在下就结合QuickBurro开发了一个百度地图接口控件TMBBaiduMap,主要为移动应用提供了指定地理区域内分类信息检索、模糊检索、根据地名求地理坐标、根据IP求地理坐标、静态地图生成、单点位置标注、GPS转百度坐标纠偏转换等功能。具体见盒子上的这个论坛帖子: http://bbs.2ccc.com/topic.asp?topicid=451037 然而,熟悉百度地图API的朋友都知道,在百度LBS开放平台上能做的远不止这些,因此,上半年做的这个控件,还有很大的升级改进余地,还有大量的LBS功能有待挖掘及引入Delphi开发工具。基于这个原因,俺在近日花了点时间,对TMBBaiduMap控件进行了升级改进,增加了许多深度应用的控件方法,并且,还开发了Windows桌面程序使用的VCL控件TRemoteBaiduMap。 1、我们来看一下此控件的概况:控件属性见下图,新增的控件方法如下(原有方法略): procedure ClearPoints; procedure AddPoint(const Long: double; const Lat: double); // function ShowLocation(): boolean; function ShowMultiPoints(): boolean; function ShowDriving(const StartName: string; const EndName: string; const DriveMode: integer): boolean; overload; function ShowDriving(const Long1,Lat1,Long2,Lat2: double; const DriveMode: integer): boolean; overload; function ShowWalking(const StartName: string; const EndName: string): boolean; function ShowPanorama(): boolean; function ShowSearch(aKeyword: string): boolean; // procedure ClearDrawings; procedure DrawPoint(const Long: double; const Lat: double); procedure DrawPolyline(); procedure DrawCircle(const aLong,aLat,aRadius: double); procedure DrawPolygon(); procedure DrawRectangle(const aLong1,aLat1,aLong2,aLat2: double); procedure DrawArea(const AreaName: string); function ShowDrawing(): boolean;
此帖子包含附件: 大小: 150.4K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:51:29
1楼:
2、给定起止地名的行车路线检索 代码: procedure TForm1.Button5Click(Sender: TObject); begin bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.Scale:=11; bdmap.ShowDriving('三墩','南星桥',0); end; 效果:
此帖子包含附件: 大小: 82.9K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:52:43
2楼:
3、给定起止地名的步行路径规划 代码: procedure TForm1.Button7Click(Sender: TObject); begin bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.Scale:=12; bdmap.ShowWalking('拱宸桥','龙井'); end; 效果:
此帖子包含附件: 大小: 78.4K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:53:54
3楼:
4、遮盖层绘图 示例代码: procedure TForm1.Button8Click(Sender: TObject); begin // // 设置比例、中心点... bdmap.Scale:=15; bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.ClearDrawings; // // 点... bdmap.DrawPoint(120.22,30.26); // // 折线... bdmap.StrokeColor:=TColorRec.Blue; bdmap.ClearPoints; bdmap.AddPoint(120.22,30.25); bdmap.AddPoint(120.23,30.265); bdmap.AddPoint(120.235,30.256); bdmap.AddPoint(120.213,30.263); bdmap.DrawPolyline; // // 圆... bdmap.StrokeColor:=TColorRec.Red; bdmap.DrawCircle(120.22,30.26,800); bdmap.DrawCircle(120.26,30.20,500); // // 矩形... bdmap.StrokeColor:=TColorRec.Green; bdmap.DrawRectangle(120.222,30.25,120.231,30.268); // // 开始绘... bdmap.ShowDrawing; end; 效果:
此帖子包含附件: 大小: 67.3K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:55:16
4楼:
5、行政区域边界框定 代码: procedure TForm1.Button9Click(Sender: TObject); begin bdmap.Scale:=16; bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.ClearDrawings; bdmap.StrokeColor:=TColorRec.Green; bdmap.DrawArea('杭州市'); bdmap.ShowDrawing; end; 效果:
此帖子包含附件: 大小: 84.3K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:56:26
5楼:
6、街区实景的查看 代码: procedure TForm1.Button10Click(Sender: TObject); begin bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.Scale:=12; bdmap.ShowPanorama; end; 效果:
此帖子包含附件: 大小: 108.7K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:57:14
6楼:
使用实景选景器后,街区实景就出来啦:
此帖子包含附件: 大小: 83.9K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 20:58:22
7楼:
7、地理信息检索与标注 代码: procedure TForm1.Button11Click(Sender: TObject); begin bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.Scale:=12; bdmap.ShowSearch(trim(edit1.Text)); end; 效果:
此帖子包含附件: 大小: 82.1K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/15 21:00:50
8楼:
8、结束语 有了以上这些深度挖掘的地图平台功能后,我们就可以根据项目需要实现自己的一些简单的地理信息系统了,特别是第4点:遮盖层的绘图,用处会更大。 相信有商业头脑的你,能有所启发。
----------------------------------------------
樵夫的大马甲
作者:
xibei (xibei)
★☆☆☆☆
-
盒子活跃会员
2014/10/15 21:01:55
8楼:
好资料!
----------------------------------------------
-
作者:
2014/10/15 22:22:11
9楼:
谢谢分享!
----------------------------------------------
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2014/10/16 13:46:49
10楼:
支持
----------------------------------------------
-我的博客
作者:
sqlnew (sqlnew)
★☆☆☆☆
-
盒子活跃会员
2014/10/16 15:30:37
11楼:
谢谢樵夫的努力,请问在哪里下载?
----------------------------------------------
-
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2014/10/16 16:24:19
12楼:
楼上你可以买的,没有下载。
----------------------------------------------
-我的博客
作者:
2014/10/17 7:55:04
13楼:
功能增强的控件会在QuickBurro新版V4.36里发布,预计发布时间在下个月,到时可以下载试用
----------------------------------------------
樵夫的大马甲
作者:
2014/10/24 8:28:39
14楼:
9、地图坐标的点击拾取 通过将点击的地理坐标拾取到App以实现精准的地理位置采集和修正,这个功能在实际应用项目开发中很有用。下面是示例: // // 准备坐标拾取... procedure TForm1.Button12Click(Sender: TObject); begin edit2.Text:=''; bdmap.Scale:=15; bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; Receiver.QueryInterval:=2; Receiver.Active:=true; if not bdmap.ShowPointPicker() then Receiver.Active:=false; end; // // 坐标拾取回调... procedure TForm1.ReceiverMessageArrives(Sender: TObject; NewMsgCount: Integer); var i: integer; MsgParcel: TMBParcel; begin Receiver.Active:=false; for i := 0 to NewMsgCount-1 do begin if Receiver.PopMessage(MsgParcel) then begin if MsgParcel.GoodsExists('Coor_Pick_Flag') then begin PickedLong:=MsgParcel.GetDoubleGoods('Long'); PickedLat:=MsgParcel.GetDoubleGoods('Lat'); edit2.Text:=formatfloat('0.000000',PickedLong)+','+formatfloat('0.000000',PickedLat); end; end; end; end; // // 坐标拾取验证... procedure TForm1.Button13Click(Sender: TObject); begin // // 设置比例、中心点... bdmap.Scale:=15; bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.ClearDrawings; // // 点... bdmap.DrawPoint(pickedlong,pickedlat); // // 开始绘... bdmap.ShowDrawing; end;
此帖子包含附件: 大小: 80.0K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/24 8:31:05
15楼:
10、一个综合案例 再给出一个综合案例: 多点GPS定位监控系统,一个给其他公司定制的小单,花了俺两个礼拜的时间.
此帖子包含附件: 大小: 873.0K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/24 8:39:50
16楼:
11、核心的技术问题:大数据预提交 由于地图表现采用TWebBrowser,所以一般只能通过URL提交少量参数,显然,这是一个极大的功能限制,咱因此专门使用了中间件功能来预提交大数据块,然后进行复杂地图的表现。 下面看一个更复杂点的遮盖层绘图示例,数据量就大了很多了: procedure TForm1.Button8Click(Sender: TObject); var url: string; sql: string; begin // // 设置比例、中心点... bdmap.Scale:=15; bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.ClearDrawings; // // 标注点... bdmap.DrawPoint(120.22,30.26,'这里是NB的中点'); // // 标注弹跳点... bdmap.DrawAnimatedPoint(120.214,30.253); // // 标注自定义图标... if MBConn.Port=80 then url:='http://'+string(MBConn.Host)+'/man.gif' else url:='http://'+string(MBConn.Host)+':'+inttostr(MBConn.Port)+'/man.gif'; bdmap.drawIcon(120.224,30.268,106,100,url); // // 画折线... bdmap.StrokeColor:=TAlphaColorRec.Black; bdmap.ClearPoints; bdmap.AddPoint(120.22,30.25); bdmap.AddPoint(120.23,30.265); bdmap.AddPoint(120.235,30.256); bdmap.AddPoint(120.213,30.263); bdmap.DrawPolyline; // // 画弧线... bdmap.StrokeColor:=TAlphaColorRec.Blue; bdmap.ClearPoints; bdmap.AddPoint(120.22,30.25); bdmap.AddPoint(120.23,30.265); bdmap.AddPoint(120.235,30.256); bdmap.AddPoint(120.213,30.263); bdmap.DrawCurveLine; // // 画圆... bdmap.StrokeColor:=TAlphaColorRec.Red; bdmap.DrawCircle(120.22,30.26,800); bdmap.DrawCircle(120.26,30.20,500); // // 画矩形... bdmap.StrokeColor:=TAlphaColorRec.Green; bdmap.DrawRectangle(120.222,30.25,120.231,30.268); // // 坐标来自数据库的多点标注... sql:='select * from coortable1'; bdmap.DrawMultiPoints('testdb',sql,'long','lat','Name'); // // 坐标来自数据库的折线绘制... bdmap.StrokeColor:=TAlphaColorRec.Gray; sql:='select * from coortable1'; bdmap.DrawPolyline('testdb',sql,'long','lat'); // // 坐标来自数据库的多边形绘制... sql:='select * from coortable1'; bdmap.DrawPolygon('testdb',sql,'long','lat'); // // 显示... bdmap.ShowDrawing; end;
此帖子包含附件: 大小: 81.5K
----------------------------------------------
樵夫的大马甲
作者:
2014/10/25 22:45:22
17楼:
12、轨迹追踪 可以用客户端程序指定轨迹数据的追踪动画显示,也可以用来自数据库的轨迹数据进行动画显示: // // 运动轨迹(来自数据库)... procedure TForm1.Button22Click(Sender: TObject); var sql: string; url: string; begin if MBConn.Port=80 then url:='http://'+string(MBConn.Host)+'/dog.gif' else url:='http://'+string(MBConn.Host)+':'+inttostr(MBConn.Port)+'/dog.gif'; bdmap.Scale:=15; bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.265244; bdmap.StrokeColor:=TAlphaColorRec.Red; sql:='select * from coortable1'; bdmap.ShowTrack(url,145,72,0,0,'testdb',sql,'long','lat'); end;
此帖子包含附件: 大小: 82.5K
----------------------------------------------
樵夫的大马甲
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2014/10/25 23:12:03
18楼:
太强了!
----------------------------------------------
-我的博客
作者:
2014/10/27 10:56:27
19楼:
好奇的问一句,XE7不是支持直接导入Java 写的SDK了吗,那么直接用百度提供的Android平台电子地图SDK,不是更好些?
----------------------------------------------
-
作者:
2014/10/27 11:00:16
20楼:
人家用 浏览器 也能实现,何必用 SDK ? 不过 SDK 可以做离线的。
----------------------------------------------
(C)(P)Flying Wang
作者:
2014/10/31 8:20:00
21楼:
此控件目前已经开发测试完毕. 此控件全部方法如下: // // 构造实例... Constructor Create(AOwner: TComponent); override; // // 析构... Destructor Destroy(); override; // // 取地图定位URL... function LocationURL(const aLong: double; const aLat: double; const Scale: integer=17): string; // // 地理信息检索... function GeocodingQuery(const ObjectType: string; const aCity: string; PageSize: integer; PageNo: integer; var ObjectList: TGeocodingList): boolean; // // 模糊查找... function SuggestionQuery(const aKeyword: string; const aCity: string; var ObjectList: TSuggestionList): boolean; // // 根据地名求地理坐标... function Addr2Geo(const aAddr: string; var aLong: double; var aLat: double): boolean; // // 根据坐标反求地名... function Geo2Addr(const aLong: double; const aLat: double; var Addr: string): boolean; // // GPS原始坐标转百度坐标... function GPS2Baidu(const GpsLong: double; const GpsLat: double; var aLong: double; var aLat: double): boolean; // // 根据IP地址求百度地理坐标... function IP2Geo(const IPAddress: string; var aLocation: TIPLocation): boolean; // // 取某坐标为中心的静态地图... function GetMapImage(const CenterLong: double; const CenterLat: double; const ImageWidth: integer; const ImageHeight: integer; const Zoom: integer; var Image: TMemoryStream): boolean; // // 计算两点间距离... function GetDistance(lat1, lng1, lat2, lng2: Double): Double; // // 清除点集合... procedure ClearPoints; // // 向点集合增加一个点... procedure AddPoint(const Long: double; const Lat: double; const Title: string=''); // // 显示由(centerLong、centerLat)指定位置的地图... function ShowLocation(): boolean; overload; // // 显示由城市名决定中点的地图... function ShowLocation(CityName: string): boolean; overload; // // 在地图上标注点集合... function ShowMultiPoints(): boolean; overload; // // 在地图上标注数据来自数据库的点集合... function ShowMultiPoints(const dbid: string; const sql: string; const longfield: string; const latfield: string; const TitleField: string=''): boolean; overload; // // 在地图上标注带点击提示窗的点集合... function ShowMultiPoints2(const WindowTitle: string; const WindowWidth: integer; const WindowHeight: integer): boolean; overload; // // 在地图上标注带点击提示窗且数据来自数据库的点集合... function ShowMultiPoints2(const WindowTitle: string; const WindowWidth: integer; const WindowHeight: integer; const dbid: string; const sql: string; const longfield: string; const latfield: string; const TitleField: string=''): boolean; overload; // // 显示指定起终点地名和驾车策略的驾车路线... function ShowDriving(const StartName: string; const EndName: string; const DriveMode: integer): boolean; overload; // // 显示指定起终点坐标和驾车策略的驾车路线... function ShowDriving(const Long1,Lat1,Long2,Lat2: double; const DriveMode: integer): boolean; overload; // // 显示指定起终点地名的步行路线... function ShowWalking(const StartName: string; const EndName: string): boolean; // // 显示(centerLong,centerLat)指定的位置的街区实景,并可指定是否显示相册... function ShowPanorama(ShowAlbums: boolean=false): boolean; // // 显示(centerLong,centerLat)指定的位置的地图与全景图层... function ShowPanorama2(): boolean; // // 显示(centerLong,centerLat)指定的位置的旋转街区全景... function ShowPanorama3(): boolean; // // 单关键词地图区域检索... function ShowSearch(aKeyword: string): boolean; // // 多关键词地图区域检索... function ShowMultiSearch(KeywordList: string): boolean; // // 矩形区域多关键词地图检索... function ShowRectangleSearch(const Long1,Lat1,Long2,Lat2: double; const KeywordList: string): boolean; // // 圆形区域多关键词地图检索... function ShowCircleSearch(const Radius: double; const KeywordList: string): boolean; // // 显示(centerLong,centerLat)处的路况叠合图... function ShowTraffic(): boolean; overload; // // 显示指定城市的路况叠合图... function ShowTraffic(Const CityName: string): boolean; overload; // // 显示坐标拾取地图... function ShowPointPicker(): boolean; // // 显示由点集合所定的运行轨迹... function ShowTrack(const CursorUrl: string; const CursorWidth: integer; const CursorHeight: integer; const OffsetX: integer; const OffsetY: integer): boolean; overload; // // 显示坐标数据来自数据库的运行轨迹... function ShowTrack(const CursorUrl: string; const CursorWidth: integer; const CursorHeight: integer; const OffsetX: integer; const OffsetY: integer; Const DatabaseId: string; const Sql: string; const LongField: string; const LatField: string): boolean; overload; // // 清楚遮盖层图元集... procedure ClearDrawings; // // 新增点到遮盖层图元集... procedure DrawPoint(const Long: double; const Lat: double; const Title: string=''); // // 新增弹跳点到遮盖层图元集... procedure DrawAnimatedPoint(const Long: double; const Lat: double; const Title: string=''); // // 新增自定义图标到遮盖层图元集... procedure DrawIcon(const Long: double; const Lat: double; const IconWidth: integer; const IconHeight: integer; const Url: string); // // 新增折线到遮盖层图元集... procedure DrawPolyline(); overload; // // 新增数据来自数据库的折线到遮盖层图元集... procedure DrawPolyline(const dbid: string; const sql: string; const longfield: string; const latfield: string); overload; // // 新增弧线到遮盖层图元集... procedure DrawCurveLine(); // // 新增圆到遮盖层图元集... procedure DrawCircle(const aLong,aLat,aRadius: double); // // 新增多边形到遮盖层图元集... procedure DrawPolygon(); overload; // // 新增数据来自数据库的多边形到遮盖层图元集... procedure DrawPolygon(const dbid: string; const sql: string; const longfield: string; const latfield: string); overload; // // 新增矩形到遮盖层图元集... procedure DrawRectangle(const aLong1,aLat1,aLong2,aLat2: double); // // 新增行政区边界到遮盖层图元集... procedure DrawArea(const AreaName: string); // // 新增数据来自数据库的麻点到遮盖层图元集... Procedure DrawMultiPoints(const dbid: string; const sql: string; const longfield: string; const latfield: string; const TitleField: string=''); // // 显示遮盖层图形... function ShowDrawing(): boolean; overload; // // 显示遮盖层图形,但其数据来自预提交的数据区... function ShowDrawing(const DataName: string): boolean; overload; // // 得到遮盖层图形数据体... function DrawingData(): TBytes; // // 取最后一次失败的错误信息... function LastError(): string; 此控件的主要属性: // // 连接中间件的基本连接对象... property Connection: TMBConnection read fConnection write SetConnection; // // 百度平台用户密钥(请应用开发方自行申请)... property BaiduKey: string read fBaiduKey write SetBaiduKey; // // 接口插件虚拟动态页面扩展名... property DynPageExt: string read fDynPageExt write SetDynPageExt; // // 浏览器控件对象... property Browser: TWebBrowser read fBrowser write SetBrowser; // // 中心点经度... property CenterLong: double read fCenterLong write SetCenterLong; // // 中心点纬度... property CenterLat: double read fCenterLat write SetCenterLat; // // 地图比例... property Scale: integer read fScale write SetScale; // // 标题... property Title: string read fTitle write SetTitle; // // 画笔颜色... property StrokeColor: string read fStrokeColor write SetStrokeColor; // // 线宽... property StrokeWeight: integer read fStrokeWeight write SetStrokeWeight; // // 填充区透明度... property StrokeOpacity: double read fStrokeOpacity write SetStrokeOpacity; 此控件相关事件: OnUrlReady事件: 地图展示的URL生成完成时激发的事件,若不指定浏览器控件,则可以在此事件里使用你自己的浏览器控件来展示 TMsgReceiver.OnPluginMessage事件: 收到坐标拾取回调信息的事件,可以在此获取所点击点的经纬度信息
----------------------------------------------
樵夫的大马甲
作者:
2014/10/31 8:36:24
22楼:
想问问可不可以实现这样的功能? 定好一个坐标后,我想查询这个坐标方圆X公里的所有公共设施,比如医院、超市、酒店等等?
----------------------------------------------
-
作者:
2014/10/31 9:11:11
23楼:
可以哦,圆形区域内多关键词检索
----------------------------------------------
樵夫的大马甲
作者:
2014/10/31 9:17:47
24楼:
// // 圆形区搜索... procedure TForm1.Button27Click(Sender: TObject); begin bdmap.CenterLong:=120.219818; bdmap.CenterLat:=30.263244; bdmap.Scale:=14; bdmap.StrokeColor:='blue'; bdmap.StrokeWeight:=3; bdmap.StrokeOpacity:=0.3; bdmap.ShowCircleSearch(2000,trim(edit3.Text)); end;
此帖子包含附件: 大小: 80.8K
----------------------------------------------
樵夫的大马甲
作者:
2014/11/5 8:59:29
25楼:
我的VPS测试服已经恢复,现在把demo程序传上来,感兴趣的可以下载试用、体验一下其强大功能:
----------------------------------------------
樵夫的大马甲
作者:
axfx (axfx)
▲▲▲▲▲
-
普通会员
2014/11/5 20:47:23
26楼:
努力学习中...
----------------------------------------------
超低价出售pos/进销存/收银软件源码 https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.4fee645eC26dvB&ft=t&id=671027238807
作者:
xibei (xibei)
★☆☆☆☆
-
盒子活跃会员
2014/11/26 10:04:58
27楼:
这控件是免费的,还是需要购买?怎么购买?
----------------------------------------------
-
作者:
2014/11/26 10:35:55
28楼:
此控件在QuickBurro V4.36里带(Win桌面和手机都支持) 下载试用、报价等见产品网站: http://www.quickburro.com/
----------------------------------------------
樵夫的大马甲