如何在图上,用户可以以不规则的闭合的线条将地图划分成若干的块,每划分成一块时就将这块的代号记录到数据库?(40分)

  • 主题发起人 主题发起人 johnnywong
  • 开始时间 开始时间
J

johnnywong

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在一张BMP/JPG图上,用户可以以不规则的闭合的线条将地图划分成若干的块,而且线条得颜色可以让用户选择,每划分成一块时就将这块的代号记录到数据库,当用户点选某个划分好的区域时会弹出信息提示框,有点类似网页里的热区设置,请问怎么实现?
 
哪位高手能回答我的问题,thx
 
试试看
先定义数据格式,该格式包括线条坐标、块号、所在图层号、图块颜色、线条颜色、线条粗细、线条线型、图块填充格式......,具体可以参考DWG格式
既可以保存到数据库里也可以直接保存成文件。
在IMAGE的MOUSEMOVE事件里,根据鼠标做在的X、Y值判断在那个图块内(有标准函数)
然后重新画线和图块。
比较麻烦
要记录线条的路径或坐标,
 
TMapData地图控件说明
-----------------------------Talent Corp. QQ:4818472
• MapX可以实现矢量图的绘制和控制,但不能响应短时间内大量用户的并发响应,而必须串行处理, 无法满足实际需求, SQL Server功能强大,速度快,可以响应并发请求, 但不能实现矢量图, 可以将两者结合,先把mapinfo矢量图的所有图元信息 (经纬度,颜色,符号...)导出到数据库中,然后在网络上访问,使用TCanvas对象进行绘制,注意经纬度和图形像素的转换, 速度很快,如果是C/S结构,能方便实现,如果是B/S结构, 必须下载ACTIVEX控件,等于只要下载图元记录,在客户端实现绘制,本方案完美实现矢量图和速度的结合,对用户数量没有限制, 因为利用了SQL服务器的高性能,且可以放弃mapx,对程序的部署和安装的压力大大减轻。
• 使用Delphi开发ActiveX控件TMapData,实现以上思路.适用于车辆监控和地图查询项目,并可根据实际项目修改控件,增加功能.
• 与MapX相比有以下特点
文件小:1M左右
简单:1天就可学会
地图数据与程序分离:地图数据存放在数据库中,而不是本地
地图数据透明:SQL Server数据库,可轻松维护
网络应用:局域网和互联网皆可,只要能连接数据库
并发性能:SQL Server的并发性能不用多说,地球人都知道
• 免费提供控件的DEMO版本(MapDataProj1.ocx)
• 免费提供测试程序源代码(delphi源码,如果没有装delphi,可以把pas文件改成txt进
行参考,如UnitTestMap.pas UnitTestMap.txt)
• 免费提供Mapinfo地图文件到数据库的转换程序(需要安装Mapx5)
• 免费提供测试网页(在IE中使用javascript调用ocx)
•
•
工作流程
1. 安装SQL Server 2000数据库服务器
2. 建立数据库(本例子中为 “DT”)
3. 把Mapinfo格式的地图文件中的所有图元信息倒入数据库(本例子已完成,从文件‘DT20060126.BAK’还原)
4. 安装控件TMapData(命令:‘regsvr32 D:/TMapData公开部分/控件/MapDataProj1.ocx’,路径看实际情况)
5. 使用连接方法连接数据库
6. 使用画图方法绘制图形
7. 使用控件的其他属性和方法控制图形


控件属性:
ServerIP:string 数据库服务器地址
UserName:string 数据库服务器帐号
PassWord:string 数据库服务器密码
DataBase:string 数据库名称,例子中为”DT”
Tool:string 地图操作工具
工具 含义
Big 放大
Small 缩小
Move 移动
Distance 两点距离测量
none 空的工具,没有功能,只是点击图片,用于增加点图元的时候获得经纬度
polygon 绘制多边形工具
Select 选择
GstID:integer地图ID
SelectFeature:integer选中的图元编号
Connected:boolean 是否已连接数据库
CenterX:float 中心经度
CenterY:float 中心纬度
ViewDistance:float 视野宽度(公里)
Zoom:float 缩放比 100显示全图,50显示一半
GetJD(x: Integer): Single 得到经度.参数像素X
GetWD(y: Integer): Single 得到纬度,参数像素Y
GetDistance(x1, y1, x2, y2: Single): Single 得到两点距离,参数两点的经纬度
GetAngle(jd, wd, jdold, wdold: Single): Single 得到两点的角度,参数两点的经纬度
AngleName(Angle: Single): WideString 得到方向的名称,参数角度,返回”东,南,西,北...
Getx(JD: Single): Integer 得到像素X,参数经度

GetY(wd: Single): Integer 得到像素Y,参数纬度
GetWidth: Single 得到地图边界左右经度差
GetHeight: Single 得到地图边界上下纬度差
GetFeatures(x, y: Single;count: Integer): WideString 得到附近的图元,参数点的经纬度,想
得到图元的数量,返回CommaText(逗号分隔结果),
QueryFeature(const name: WideString): WideString 查询类似名称的图元,参数名称,
返回CommaText(逗号分隔结果)
ShowTempLayer: WordBool 是否显示临时图层
BackColor: Integer 背景颜色
QueryCenter(x, y, distance: Single): WideString 查询中心点附近的的点图元,参数经纬
度, 距离(公里), 返回CommaText(逗号分隔结果)
AllLayers: WideString 得到所有的层,返回CommaText(逗号分隔结果)
VisibleLayers: WideString 设置可以显示的层,
参数CommaText(逗号分隔结果)
PopMenu: WideString 设置弹出菜单(当选中点图元的时候触发),
参数CommaText(逗号分隔结果)
ShowControlButton: WordBool 是否显示控制按钮(放大,缩小,移动...)

控件方法:
AboutBox:调用”关于”对话框
ConnectSQL:连接数据库
DrawMap(GstID: Integer):绘制城市地图,参数:地图ID,参考表map字段ID
LocateFeature(const name: WideString) 把图元的中心点作为地图的中心,参数图元名称
MoveTo(x, y: Single) 移动地图,参数:经纬度
AddTempPoint(const Name: WideString; jd, wd: Single;radius: Integer)
在临时图层上增加点,参数:图元名称,经纬度,半径
DeleteTempFeature 删除临时图元
AddTempLine(const name, nodes: WideString; Arrow: WordBool)
  在临时图层上增加线,参数:图元名称,节点(commatext),是否显示箭头
AddPoint(const Name: WideString; x, y: Single; LayerID: Integer)
在图层上增加点,参数:图元名称,经纬度,图层ID
事先要把工具设为”none”来点击图片获得经纬度
SaveToJpg(const FileName: WideString) 保存到JPG图片,参数:JPG文件名
AddPolygon(const name: WideString; LayerID: Integer) 增加多边形
参数:多边形名称,所属层的ID,
事先必须选择工具”polygon”,在地图上用鼠标绘出多边形
(移动画线,单击确定中间点,双击完成)
控件事件:
ViewChanged(Sender: TObject):地图视野改变
MouseMove(ASender: TObject; x, y: Integer; jd, wd: Single):
鼠标移动,参数像素,经纬度
MouseDown(ASender: TObject; x, y: Integer; jd, wd: Single):
鼠标按下, 参数像素,经纬度
MouseUp(ASender: TObject; x, y: Integer; jd, wd: Single):
鼠标抬起, 参数像素,经纬度
Select(ASender: TObject; FeatureID: Integer; const FeatureName: WideString)
图元被选择,参数图元编号,图元名称
Distance(ASender: TObject; Distance: Single)
当使用距离工具的时候触发,参数距离(公里)
MenuClick(ASender: TObject; const MenuItem: WideString;
FeatureID: Integer; const FeatureName: WideString);
选中点图元以后按下菜单触发
参数:菜单项,图元编号,图元名称
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部