WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院软件开发VC 用VC++实现矢量地图背景下的实时显示 阅读

用VC++实现矢量地图背景下的实时显示

 2008-11-14 19:35:22 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姇閹碱偆鐥閺屾洘绻濊箛鏇犵獥闂佺厧澹婃禍婊堚€旈崘顏佸亾閿濆骸澧ù鐘欏嫮绠鹃柛顐ゅ枎閻忋儲銇勯弴妯哄姦妞ゃ垺鐟╅幃鈩冩償閵囧府鎷�
核心提示: 5. 编译运行软件,将屏幕显示分辨率设置为1600′1024,用VC++实现矢量地图背景下的实时显示(4),则在右半屏出现地图窗口,现在剩下的工作只是加入接收目标数据并转换为经纬度后进行实时显示,原因是实时数据正在对plane表进行编辑,此时再改变其它图层,这里只给出同地图窗口

5. 编译运行软件,将屏幕显示分辨率设置为1600′1024,则在右半屏出现地图窗口。现在剩下的工作只是加入接收目标数据并转换为经纬度后进行实时显示,这里只给出同地图窗口有关的部分,假设正在不断接收目标数据,写入全局变量中,并向CmapAppView类发送消息,调用CmapAppView类的ShowMapLine()函数。在MapApp.cpp文件中添加全局变量定义:  double global_long;//经度
  double global_lat;//纬度
  double global_long_last;//上一点经度
  double global_lat_last;//上一点纬度
  unsigned long global_num; file://接收点计数

在MapApp.h文件中添加全局变量说明:

  extern double global_long;//经度
  extern double global_lat;//纬度
  extern double global_long_last;//上一点经度
  extern double global_lat_last;//上一点纬度
  extern unsigned long global_num; file://接收点计数

在CmapAppView::OnInitialUpdate()函数的结束部分添加如下代码:

/////////////////定义mapinfo中所用的变量

  mapinfo.Do("Dim obj1 As Object"); file://飞机图标点对象
  mapinfo.Do("Dim Line1 As Object"); file://航迹线对象
  global_num = 0; file://接收目标数据计数初始化为0

在CmapAppView:: ShowMapLine()函数代码如下:

程序清单3 MapAppView.cpp文件

  void CMapAppView::ShowMapLine()
  {
  char str[256];
  //画飞机图标
  double m_angle = COPI*atan2((global_lat - global_lat_last),
  (global_long - global_long_last))-90;//目标角度
  sprintf(str,
  "Create Point Into Variable obj1 (%lf,%lf) Symbol (85,255,30,"MapInfo Transportation",0,%lf)",
  global_long, global_lat, m_angle); file://设置飞机目标显示的样式
  mapinfo.Do(str); file://创建目标图标对象
  if (global_num >0 )
  {/*收到的第一点,在plane表中插入第一条记录,后面的点都是更新第一条记录*/
  sprintf(str,
  "Update plane Set Obj = obj1 Where RowID = %lu",1);}
  else {
  sprintf(str,
  "Inset Into plane (ID,Obj) Values (%lu,Line1) ", global_num);
  }
  mapinfo.Do(str);//用obj1对象更新表中的记录
  //画各设备的航迹
  sprintf(str,
  "Create Line Into Variable Line1 (%lf,%lf) (%lf,%lf) Pen MakePen(2,2,255)",
  global_long_last, global_lat_last , global_long, global_lat);
  mapinfo.Do(str);//创建line1对象
  if (global_num >0 )
  {//第一个点不画航迹
  sprintf(str,"Fetch Last From plane");
  mapinfo.Do(str);
  file://插入line1到表中
  sprintf(str,"Insert Into plane (ID,Obj) Values (%lu,Line1)",global_num);
  mapinfo.Do(str);
  }
  global_num ++;
  }

6. 编译运行软件

要保存plane表,可在CmapAppView类的析构函数中添加下面的代码:

程序清单4 MapAppView.cpp文件

  CMapAppView::~CMapAppView()
  {
  char str[256];
  if (m_hWindowHwnd) file://地图窗口存在
  {
  sprintf(str,"Close Window %lu",m_lWindowid);
  mapinfo.Do(str);
  m_hWindowHwnd = NULL;
  m_lWindowid = 0L;
  mapinfo.Do("Commit Table plane");//保存实时航迹表
  }
  }

左屏显示内容的构造,可根据各软件系统的要求,显示数据,图表等,由VC++编程实现。

三、 其它说明

上面程序清单2中

sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);

语句中的Animate属性一定要有,这表示将plane图层设置为动态(Animate)图层,每个地图窗口只能有一个动态图层,当这个图层上的对象变化时,地图窗口只刷新此图层,以便可以实现快速刷新。

在应用OLE技术嵌入地图窗口的应用中,还可根据需要加入多种工具,用于地图信息的修改和查询,如标尺窗口,信息窗口,图层控制,图层选择编辑等,但在实时接收数据并显示的状态下,有些功能的使用将会导致访问冲突,以致程序出错,如图层控制、图层编辑等,原因是实时数据正在对plane表进行编辑,此时再改变其它图层,就与mapInfo一次只能编辑一个图层的原则产生了冲突。

上一页  1 2 3 4 

Tags:VC 实现 矢量

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接