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.
{* |<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.