发表用户:讨论贴
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?BoardID=4&id=8652
信息原始来源:James MapInfo技术论坛

文章标题:

bota

地图上汽车图标想根据行驶方向进行旋转?怎么做呢??????????

shellchan

Feature好象没有Rotate方法
我个人觉得你可以用这个方法,其他的我也帮不了了。
Feature.Replace(ftr);ftr为旋转的车图,来改变方向?
不知你的意见如何?

bota

shellchan的方法不是很好
可以用汽车字体的方法,可是有个问题,怎么能扩展汽车字体的内容呢。
我想找个箭头可找不到,想找个车头朝左和朝右各一张,也找不到。
谁有什么方法吗?

bota

字体文件好象可以注册,有谁知道怎么注册吗?

shellchan

用第三方的图片编辑一下,保存到图库中嘛。
自己要辛苦一下了,毕竟是为自己嘛。
加油!
不过我要学习你的方法,我查询了一下,好象Text有Rotate,但bitmap怎么能旋转呢?
只能是Text旋转啊?等待你的好消息!

许大马棒

这个需要对图像进行旋转变换,就是乘以一个旋转矩阵。否则汽车的角度那么多,你用图片怎么弄得过来?

bota

用图片不能进行旋转是不行的,只能通过注册字体文件来实现旋转。可是我不知道怎么注册字体文件?

zhangly

网上的例子

void __fastcall TMainFrm::SpeedButton2Click(TObject *Sender)
{
// Set active tool to be vehicle plotting tool
  Map1->CurrentTool = PLOT_VEHICLE_TOOL;
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::SpeedButton7Click(TObject *Sender)
{
  Map1->CurrentTool = miZoomInTool;
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::SpeedButton8Click(TObject *Sender)
{
  Map1->CurrentTool = miZoomOutTool;
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::SpeedButton9Click(TObject *Sender)
{
// Display MapX stock layer control dialog
  Map1->Layers->LayersDlg(EmptyParam,EmptyParam);
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Map1ToolUsed(TObject *Sender, short ToolNum,
      double X1, double Y1, double X2, double Y2, double Distance,
      VARIANT_BOOL Shift, VARIANT_BOOL Ctrl, VARIANT_BOOL *EnableDefault)
{
  CMapXFeature *fNewSymbol;
  CMapXFeature *fMapSymbol;
  CMapXPointDisp pt;
  CMapXStyleDisp style;
  Variant st;

  switch(ToolNum)
  {
    case PLOT_VEHICLE_TOOL:
    {
      pt.Bind(StringToOleStr("MapX.Point.5"));
      pt->Set_(X1,Y1);
      style.Bind(StringToOleStr("MapX.Style.5"));

      style=Map1->DefaultStyle->Clone();
      style.set_SymbolBitmapTransparent(true);

      fNewSymbol = NULL;
      fNewSymbol = Map1->FeatureFactory->CreateSymbol(EmptyParam,EmptyParam);
      if(fNewSymbol!=NULL)
      {
        fNewSymbol->set_Point(pt);
        fNewSymbol->set_Style(style);
        if(lyrMyLayer!=NULL)
        {
          fMapSymbol=lyrMyLayer->AddFeature(fNewSymbol);
          if(fMapSymbol!=NULL)
          {
            fArray[iVehicleCount].fFeature = fMapSymbol;
            fArray[iVehicleCount].fStyle = fMapSymbol->Style->Clone();
            fArray[iVehicleCount].iSpeed = 50;
            fArray[iVehicleCount].dHeading = 0;
            fArray[iVehicleCount].sName = "车辆"+IntToStr(iVehicleCount);
            fArray[iVehicleCount].sText ="";
            iVehicleCount++;
            updateListCars();
            if (lstCars->Items->Count>0)
            {
              lstCars->ItemIndex=lstCars->Items->Count-1;
              lstCarsClick(NULL);
            }
          }//if(fMapSymbol!=NULL)
        }//if(lyrMyLayer!=NULL)
      }//if(fNewSymbol!=NULL)
      break;
    }
    case miZoomInTool:
    {
      Label4->Caption=FloatToStr(Map1->Zoom);
//      if(Map1->Zoom<=0.4)
//            Map1->ZoomTo(0.75,Map1->CenterX,Map1->CenterY);
      break;
    }
    case miZoomOutTool:
    {
      Label4->Caption=FloatToStr(Map1->Zoom);
//      if (Map1->Zoom>47.6871569161022)
//        Map1->ZoomTo(47.6871569161022,Map1->CenterX,Map1->CenterY);
      break;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::lstCarsClick(TObject *Sender)
{
  iCarNum = lstCars->ItemIndex;
  txtVehicleName->Enabled = true;
  txtVehicleHeading->Enabled = true;
  txtVehicleSpeed->Enabled = true;

  txtVehicleName->Text = fArray[iCarNum].sName;
  txtVehicleSpeed->Text = fArray[iCarNum].iSpeed;
  txtVehicleHeading->Text = fArray[iCarNum].dHeading;
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::txtVehicleNameChange(TObject *Sender)
{
  // If vehicle name is changed, update the feature 
  fArray[iCarNum].sName = txtVehicleName->Text; 
  fArray[iCarNum].fFeature->Keyvalue = StringToOleStr(txtVehicleName->Text);
  fArray[iCarNum].fFeature->_Update(Variant(true),EmptyParam);
  updateListCars();
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::txtVehicleHeadingChange(TObject *Sender)
{
  //角度变化 
  if(txtVehicleHeading->Text!="") 
  {
    fArray[iCarNum].dHeading = StrToFloat(txtVehicleHeading->Text);
    fArray[iCarNum].fFeature->_Update(Variant(true),EmptyParam);
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::txtVehicleSpeedChange(TObject *Sender)
{
  //速度变化 
  if(txtVehicleSpeed->Text!="")
  {
    fArray[iCarNum].iSpeed = StrToInt(txtVehicleSpeed->Text);
    fArray[iCarNum].fFeature->_Update(Variant(true),EmptyParam);
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Timer1Timer(TObject *Sender)
{
  double dYcomp, dXcomp, dYpos, dXpos;
  double dX,dY;
  int iCount;
  CMapXFeaturesPtr ftrs;
  CMapXPointDisp pt;
/*
if ft.Style.SymbolBitmapSize=20 then 
ft.Style.SymbolBitmapSize:=15 
else 
ft.Style.SymbolBitmapSize:=20; 
ft.Update(EmptyParam, EmptyParam);
*/
  for(iCount=0;iCount<iVehicleCount;iCount++)
  {
    if(fArray[iCount].iSpeed!=0)
    {
      dYcomp = fArray[iCount].iSpeed *1.852* sin(fArray[iCount].dHeading * 3.14159 / 180);
      dXcomp = fArray[iCount].iSpeed *1.852* cos(fArray[iCount].dHeading * 3.14159 / 180);
      dYpos = fArray[iCount].fFeature->CenterY + (1.0/69 * dYcomp * Timer1->Interval / 1000 * 1 /3600);
      dXpos = fArray[iCount].fFeature->CenterX + (1.0/55 * dXcomp * Timer1->Interval / 1000 * 1 /3600);
      fArray[iCount].fFeature->set_Style(fArray[iCount].fStyle);
      fArray[iCount].fFeature->Point->Set_(dXpos, dYpos);
      fArray[iCount].fFeature->_Update(Variant(true),EmptyParam);

      if (CheckBox1->Checked)
      {
        dX=fArray[lstCars->ItemIndex].fFeature->Point->get_X();
        dY=fArray[lstCars->ItemIndex].fFeature->Point->get_Y();
        Map1->ZoomTo(2.26351132841159,dX,dY);
      }
      else
      {
        Map1->Zoom=4.52700000000001;
      }

      if (lyrcztd!=NULL)
      {
        pt.Bind(StringToOleStr("MapX.Point.5"));
        pt->Set_(dXpos,dYpos);
        ftrs=lyrcztd->SearchWithinDistance(pt,300,miUnitMeter,miSearchTypeCentroidWithin);//miSearchTypePartiallyWithin);
        if (ftrs->Count>0)
        {
          if (fArray[iCount].fStyle.SymbolBitmapSize==24)
          {
            fArray[iCount].fStyle.SymbolBitmapSize=15;
          }
          else
          {
            fArray[iCount].fStyle.SymbolBitmapSize=24;
          }
          fArray[iCount].fFeature->_Update(Variant(true),EmptyParam);
          fArray[iCount].sText ="危险!!!小车在坐标("+FloatToStr(dXpos)+","+FloatToStr(dYpos)+")发现障碍物 "+IntToStr(ftrs->Count)+"个!";

          if ((FileExists(MediaPlayer1->FileName)) && (CheckBox2->Checked) &&((fArray[lstCars->ItemIndex].sText).SubString(0,4)=="危险"))
          {
            MediaPlayer1->Close();
            MediaPlayer1->Open();
            MediaPlayer1->Play();
          }
        }
        else
        {
          fArray[iCount].fStyle.SymbolBitmapSize=24;
          fArray[iCount].fFeature->_Update(Variant(true),EmptyParam);
          fArray[iCount].sText ="小车在坐标("+FloatToStr(dXpos)+","+FloatToStr(dYpos)+")没有遇到建筑物,可以安全通过!";
        }
        if (Panel2->Visible==false)
          Panel2->Visible=true;
        Label4->Caption=fArray[lstCars->ItemIndex].sText;
      }
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::SpeedButton10Click(TObject *Sender)
{
  Map1->CurrentTool = miArrowTool;        
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N1Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_right.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone();
    ftr->_Update(Variant(true),EmptyParam);

    txtVehicleHeading->Text="0";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N2Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_left.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone(); 
    ftr->_Update(Variant(true),EmptyParam); 

    txtVehicleHeading->Text="180";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N3Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_up.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone(); 
    ftr->_Update(Variant(true),EmptyParam); 

    txtVehicleHeading->Text="90";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N4Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_down.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone();
    ftr->_Update(Variant(true),EmptyParam);

    txtVehicleHeading->Text="-90";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N5Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_upleft.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone();
    ftr->_Update(Variant(true),EmptyParam); 

    txtVehicleHeading->Text="125";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N6Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_upright.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone(); 
    ftr->_Update(Variant(true),EmptyParam); 

    txtVehicleHeading->Text="45";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N7Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_downleft.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone(); 
    ftr->_Update(Variant(true),EmptyParam); 

    txtVehicleHeading->Text="-125";
  }
}
//---------------------------------------------------------------------------

void __fastcall TMainFrm::N8Click(TObject *Sender)
{
  String strCar;
  int iIndex;
  CMapXFeature *ftr;
  CMapXStyleDisp style;


  if (lstCars->Items->Count>0)
  {
    iIndex=lstCars->ItemIndex;
    strCar=lstCars->Items->Strings[iIndex];
    ftr=fArray[iIndex].fFeature;
    style.Bind(StringToOleStr("MapX.Style.5"));
    style=ftr->Style->Clone();
    style.set_SymbolBitmapName(Variant("car_downright.bmp"));
    ftr->set_Style(style);
    fArray[iIndex].fStyle=style.Clone(); 
    ftr->_Update(Variant(true),EmptyParam); 

    txtVehicleHeading->Text="-45";
  }
}
 

wenzi19xx

简单啊,先用create-font之类的字体制作软件绘制汽车形状的字体,软后将该字体放入windows/font目录下(这样会自动注册字体的),然后旋转字体就行了嘛:)

wenzi19xx

楼上的有作导航的吗?导航中用到的各种提示信息各位都是用什么方法显示的?比如罗盘啊,指南针啊,文字信息啊,直接在图层上画是不是太慢了?

ldd2w

引用别人的:
如果系统中没有合适的TrueType字体的话
就需要自己编辑,然后注册,再进行使用,要用到的几个软件有
1  FontShow (用于查看字体)
2  Font Creator (用于编辑字体,我用这个软件画了一个箭头图标)
3  Font Wrangler(用于注册字体,注意,字体分为文件名和注册名,别弄错了)

以上例子中的MyCarFont8就是我自己编辑的字体文件,呵呵(试验了8次才试通)
字体文件是一个库,里面可以有很多个字体图片,通过这个语句 SymbolCharacter = 80
来选择你想要的字体图片,80就是图片的序号,可以在FontShow这个软件里面查到

表现车辆的行驶方向有两种方法:
1 直接旋转,就是说,在一个图片的基础上,旋转不同的角度,有个不好就是自动标注
  有可能会影响表现的效果
2 不同方向不同图片(我就是用这个方法),定义8个方向,配合8张图片,根据车辆的实际
  方向,调用不同字体图片

大概经验就这么多啦,还有一种方法就是调用系统API直接将车辆图标画在屏幕上并旋转