公司需要做一个软件,就是允许用户在一张地图上使用鼠标圈划将地图划分成若干区域,请问怎么做

时间:2022-03-10 10:32:28
就是在一张本市地图上,用户可以以不规则的闭合的线条将地图划分成若干的块,每划分成一块时就将这块的代号记录到数据库,而且允许用户对已有的块进行删除和修改,请问该如何做

12 个解决方案

#1


去找一个delphi 图像热点应用的例子吧.

#2


不规则图形的建立:
procedure TForm1.FormCreate(Sender: TObject);
var
    thepoint:array [1..8] of tpoint;//存储多边形顶点坐标
    count:integer;
    pointnum:array [1..2] of integer;
begin
//四边形顶点坐标,首末点封闭
  thepoint[1]:=point(135,99);
  thepoint[2]:=point(105,183);
  thepoint[3]:=point(129,201);
  thepoint[4]:=point(188,92);
  thepoint[5]:=point(135,99);
  count:=5;//四边形顶点数目,首末点为一点
  fourE_rgn:=CreatePolygonRgn(thepoint,count,ALTERNATE);//生成四边形(多边)区域,
   form1.Canvas.Brush.Color:=clgreen;                   //api 具体看msdn


   //form1.Canvas.Pen.Color:=clred;
   //FrameRgn(getdc(0),foure_rgn,form1.Canvas.Brush.Handle,100,100);
   paintrgn(getdc(form1.Handle),foure_rgn);
 elli_rgn:=CreateEllipticRgn(64,221,231,263);// 生成椭圆形区域
  //第一个三角形顶点坐标
  thepoint[1]:=point(118,67);
  thepoint[2]:=point(32,28);
  thepoint[3]:=point(17,90);
  thepoint[4]:=point(118,67);
  //第二个三角形顶点坐标
  thepoint[5]:=point(155,44);
  thepoint[6]:=point(202,91);
  thepoint[7]:=point(277,44);
  thepoint[8]:=point(155,44);
  pointnum[1]:=4;//第一个三角形顶点数目
  pointnum[2]:=4;//第二个三角形顶点数目
  count:=2;//三角形数目
//生成由两个三角形构成的三角形区域
tri_rgn:=CreatePolyPolygonRgn(thepoint,pointnum,count,WINDING);
end;


//判断鼠标位置
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  dc:hdc;

    flag1,flag2,flag3:boolean;
begin
   //三个标志变量以判明鼠标没有击中热点
   flag1:=false; flag2:=false;  flag3:=false;
   //热点的判断
 if  ptinregion(Elli_rgn,x,y) then label1.caption:='椭圆' //api函数 具体看msdn
       else  flag1:=true;
   if ptinregion(tri_rgn,x,y) then label1.caption:='三角形'
       else flag2:=true;
   if ptinregion(fourE_rgn,x,y) then
      begin
      label1.caption:='四边形';
       dc:=getdc(form1.Handle);
       canvas.Brush.Color:=clred-15;
       fillrgn(dc,foure_rgn,canvas.Brush.Handle);
      //canvas.FillRect(foure_rgn);
      end
       else flag3:=true;
   if  (flag1 and flag2 and flag3) then  label1.caption:='鼠标没有击中热点';



#3


gis

#4


gis具体怎么做

#5


to baiduan(-_-小猩猩 @_@ 大金刚-_-) :
fourE_rgn ,tri_rgn 没有定义类型,请问应该是什么类型!

#6


可以放小方块,有级缩放。

#7


一般地图控件都有这个功能,我用过MO控件,在MouseUP事件里边得到TrackingRect就可以了

#8


sorry,忘了
这样:

var
  Form1: TForm1;
  elli_rgn,fourE_rgn,tri_rgn:hrgn;//指向椭圆形、四边形、三角形的区域变量

//

#9


用delphi编写这种程序,支持性好不好?

#10


怎么才能看到鼠标的划图轨迹

#11


implementation  
var
x1,y1:integer;//存储前次鼠标位置
{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if (x<>x1) or (y<>y1) then//如果鼠标移动,划出轨迹
 begin
 self.Canvas.Pen.Color:=clred;
 self.Canvas.MoveTo(x1,y1);
 self.Canvas.LineTo(x,y);
 x1:=x;
 y1:=y;
 end;
end;
//是这个吗?

#12


baiduan(-_-小猩猩 @_@ 大金刚-_-):
首先感谢你的回答。

我的意思是在一张image里用鼠标画不规则的闭合多边形,而且能看到鼠标画动时的痕迹,就好像windows里的画笔功能!谢谢

#1


去找一个delphi 图像热点应用的例子吧.

#2


不规则图形的建立:
procedure TForm1.FormCreate(Sender: TObject);
var
    thepoint:array [1..8] of tpoint;//存储多边形顶点坐标
    count:integer;
    pointnum:array [1..2] of integer;
begin
//四边形顶点坐标,首末点封闭
  thepoint[1]:=point(135,99);
  thepoint[2]:=point(105,183);
  thepoint[3]:=point(129,201);
  thepoint[4]:=point(188,92);
  thepoint[5]:=point(135,99);
  count:=5;//四边形顶点数目,首末点为一点
  fourE_rgn:=CreatePolygonRgn(thepoint,count,ALTERNATE);//生成四边形(多边)区域,
   form1.Canvas.Brush.Color:=clgreen;                   //api 具体看msdn


   //form1.Canvas.Pen.Color:=clred;
   //FrameRgn(getdc(0),foure_rgn,form1.Canvas.Brush.Handle,100,100);
   paintrgn(getdc(form1.Handle),foure_rgn);
 elli_rgn:=CreateEllipticRgn(64,221,231,263);// 生成椭圆形区域
  //第一个三角形顶点坐标
  thepoint[1]:=point(118,67);
  thepoint[2]:=point(32,28);
  thepoint[3]:=point(17,90);
  thepoint[4]:=point(118,67);
  //第二个三角形顶点坐标
  thepoint[5]:=point(155,44);
  thepoint[6]:=point(202,91);
  thepoint[7]:=point(277,44);
  thepoint[8]:=point(155,44);
  pointnum[1]:=4;//第一个三角形顶点数目
  pointnum[2]:=4;//第二个三角形顶点数目
  count:=2;//三角形数目
//生成由两个三角形构成的三角形区域
tri_rgn:=CreatePolyPolygonRgn(thepoint,pointnum,count,WINDING);
end;


//判断鼠标位置
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  dc:hdc;

    flag1,flag2,flag3:boolean;
begin
   //三个标志变量以判明鼠标没有击中热点
   flag1:=false; flag2:=false;  flag3:=false;
   //热点的判断
 if  ptinregion(Elli_rgn,x,y) then label1.caption:='椭圆' //api函数 具体看msdn
       else  flag1:=true;
   if ptinregion(tri_rgn,x,y) then label1.caption:='三角形'
       else flag2:=true;
   if ptinregion(fourE_rgn,x,y) then
      begin
      label1.caption:='四边形';
       dc:=getdc(form1.Handle);
       canvas.Brush.Color:=clred-15;
       fillrgn(dc,foure_rgn,canvas.Brush.Handle);
      //canvas.FillRect(foure_rgn);
      end
       else flag3:=true;
   if  (flag1 and flag2 and flag3) then  label1.caption:='鼠标没有击中热点';



#3


gis

#4


gis具体怎么做

#5


to baiduan(-_-小猩猩 @_@ 大金刚-_-) :
fourE_rgn ,tri_rgn 没有定义类型,请问应该是什么类型!

#6


可以放小方块,有级缩放。

#7


一般地图控件都有这个功能,我用过MO控件,在MouseUP事件里边得到TrackingRect就可以了

#8


sorry,忘了
这样:

var
  Form1: TForm1;
  elli_rgn,fourE_rgn,tri_rgn:hrgn;//指向椭圆形、四边形、三角形的区域变量

//

#9


用delphi编写这种程序,支持性好不好?

#10


怎么才能看到鼠标的划图轨迹

#11


implementation  
var
x1,y1:integer;//存储前次鼠标位置
{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if (x<>x1) or (y<>y1) then//如果鼠标移动,划出轨迹
 begin
 self.Canvas.Pen.Color:=clred;
 self.Canvas.MoveTo(x1,y1);
 self.Canvas.LineTo(x,y);
 x1:=x;
 y1:=y;
 end;
end;
//是这个吗?

#12


baiduan(-_-小猩猩 @_@ 大金刚-_-):
首先感谢你的回答。

我的意思是在一张image里用鼠标画不规则的闭合多边形,而且能看到鼠标画动时的痕迹,就好像windows里的画笔功能!谢谢