地图鹰眼

unit MapNavigation;
{* |<PRE>
================================================================================
* 软件名称:FHT GPS车辆监控管理系统
* 单元名称:地图鹰眼单元
* 单元作者:HsuChong@hotmail.com
* 备    注:
* 开发平台:PWin2003Standard + Delphi 7.1
* 修改记录:
*           2007.01.27 添加MainMapMouseMove事件和ConversionToCoordinate方法
*           2006.10.07 添加ZoomMax和ZoomMin属性
*           2006.10.01 创建单元
*
================================================================================
|</PRE>}

interface

uses
  Windows, Classes, Controls, OleCtrls, MapXLib_TLB;

type
  TMapNavigation = class(TComponent)
  private
    FMainMap: TMap;
    FNavigationMap: TMap;
    FCurrentMainMapZoom: Double;
    FZoomMax, FZoomMin: Double;
  protected
    procedure SetMainMap(Value: TMap);
    procedure SetNavigationMap(Value: TMap);
    procedure SetZoomMax(Value: Double);
    procedure SetZoomMin(Value: Double);
    procedure MapNavigationMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    // procedure MainMapMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
    procedure MainMapViewChanged(Sender: TObject);

    function CreateNavLayer: Boolean;
    function DeleteAllFeatures(const LayerName: string): Boolean;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Open;
    procedure Close;
    //function ConversionToCoordinate(LongOrLat: Double): string;
    {返回经度或纬度换算为坐标格式:如:(205°23'44.1",57°55'56.6")}
  published
    property MainMap: TMap read FMainMap write SetMainMap;
    property Navigation: TMap read FNavigationMap write SetNavigationMap;
    property ZoomMax: Double read FZoomMax write SetZoomMax;
    property ZoomMin: Double read FZoomMin write SetZoomMin;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('FHTGPS', [TMapNavigation]);
end;

constructor TMapNavigation.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TMapNavigation.Destroy;
begin
  inherited Destroy;
end;

procedure TMapNavigation.Open;
begin
  CreateNavLayer;
  FCurrentMainMapZoom := MainMap.Zoom;
  FNavigationMap.OnMouseUp := MapNavigationMouseUp;
  // FMainMap.OnMouseMove := MainMapMouseMove;
  MainMap.OnMapViewChanged := MainMapViewChanged;
end;

procedure TMapNavigation.Close;
begin
  FNavigationMap.Visible := False;
end;

procedure TMapNavigation.SetMainMap(Value: TMap);
begin
  if FMainMap <> Value then
    FMainMap := Value;
end;

procedure TMapNavigation.setNavigationMap(Value: TMap);
begin
  if FNavigationMap <> Value then
    FNavigationMap := Value;
end;

procedure TMapNavigation.SetZoomMax(Value: Double);
begin
  if FZoomMax <> Value then
    FZoomMax := Value;
end;

procedure TMapNavigation.SetZoomMin(Value: Double);
begin
  if FZoomMin <> Value then
    FZoomMin := Value;
end;

procedure TMapNavigation.MapNavigationMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ScreenX, ScreenY: Single;
  MapX, MapY: Double;
begin
  ScreenX := X;
  ScreenY := Y;
  FNavigationMap.ConvertCoord(ScreenX, ScreenY, MapX, MapY, miScreenToMap);
  FMainMap.ZoomTo(FMainMap.Zoom, MapX, MapY);
end;

{procedure TMapNavigation.MainMapMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  ScreenX, ScreenY: Single;
  MapX, MapY: Double;
begin
  if MainMap.ShowHint then
  begin
    ScreenX := X;
    ScreenY := Y;
    FMainMap.ConvertCoord(ScreenX, ScreenY, MapX, MapY, MiScreenToMap);
    FMainMap.Hint := '东经:' + ConversionToCoordinate(MapX) + #13#10
      + '北纬:' + ConversionToCoordinate(MapY);
  end;
end; }

procedure TMapNavigation.MainMapViewChanged(Sender: TObject);
var
  rect: Rectangle;
  newPoint: Point;
  newPoints: Points;
begin
  if FNavigationMap.Visible then
  begin
    Navigation.Layers.Item('NavLayer').Editable := False;
    Navigation.Layers.AnimationLayer := Navigation.Layers.Item('NavLayer');
    rect := MainMap.Bounds;
    newPoint := CoPoint.Create;
    newPoints := CoPoints.Create;
    newPoint.Set_(rect.XMin, rect.YMin);
    newPoints.Add(newPoint, 1);
    newPoint.Set_(rect.XMax, rect.YMin);
    newPoints.Add(newPoint, 2);
    newPoint.Set_(rect.XMax, rect.YMax);
    newPoints.Add(newPoint, 3);
    newPoint.Set_(rect.XMin, rect.YMax);
    newPoints.Add(newPoint, 4);
    newPoint.Set_(rect.XMin, rect.YMin);
    newPoints.Add(newPoint, 5);

    DeleteAllFeatures('NavLayer');
    Navigation.DefaultStyle.LineWidth := 2;
    Navigation.DefaultStyle.LineColor := RGB(255, 0, 0);
    Navigation.Layers.Item('NavLayer').AddFeature(
      Navigation.FeatureFactory.CreateLine(newPoints, Navigation.DefaultStyle),
      EmptyParam);
  end;
  if (FZoomMax > 0) and (MainMap.Zoom > FZoomMax) then
    MainMap.Zoom := FZoomMax;
  if (FZoomMin > 0) and (MainMap.Zoom < FZoomMin) then
    MainMap.Zoom := FZoomMin;
end;

function TMapNavigation.DeleteAllFeatures(const LayerName: string): Boolean;
var
  TempFeatures: Features;
  I: Integer;
begin
  Result := True;
  try
    TempFeatures := Navigation.Layers.Item(LayerName).AllFeatures;
    if TempFeatures.Count > 0 then
      for I := 1 to TempFeatures.Count do
        Navigation.Layers.Item(LayerName).DeleteFeature(TempFeatures.Item(I));
  except
    Result := False;
  end;
end;

{function TMapNavigation.ConversionToCoordinate(LongOrLat: Double): string;
var
  TempMinute: Double;
  Degree, Minute, Second: Integer;
begin
  Result := '';
  Degree := Trunc(LongOrLat);
  TempMinute := (LongOrLat - Degree) * 60;
  Minute := Trunc(TempMinute);
  Second := Trunc((TempMinute - Minute) * 60);
  Result := Format('%d°%d’%d"', [Degree, Minute, Second]);
end; }

function TMapNavigation.CreateNavLayer: Boolean;
var
  I: Integer;
  NavLayerExist: Boolean;
begin
  Result := True;
  NavLayerExist := False;
  for I := 1 to Navigation.Layers.Count do
  begin
    if Navigation.Layers.Item(i).Name = 'NavLayer' then
    begin
      NavLayerExist := True;
      Break;
    end;
  end;
  //若导航图层不存在,则创建一个导航图层
  if not NavLayerExist then
    with Navigation.Layers do
    begin
      try
        CreateLayer('NavLayer', EmptyParam, EmptyParam, EmptyParam, EmptyParam);
        AnimationLayer := FNavigationMap.Layers.Item('NavLayer');
      except
        Result := False;
      end;
    end;
end;

end. 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值