BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/Other/GeoMaps/umain.pas

226 lines
6.4 KiB
Plaintext

unit umain;
interface
uses
// Disable Variants in Delphi 5
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, imageenview, ieview, iemview, ComCtrls, ExtCtrls, hyieutils, hyiedefs,
Buttons, StdCtrls, iexBitmaps, iesettings;
type
TMainForm = class(TForm)
Panel1: TPanel;
StatusBar1: TStatusBar;
ImageEnMView1: TImageEnMView;
ImageEnView1: TImageEnView;
SpeedButtonLeft: TSpeedButton;
SpeedButtonUp: TSpeedButton;
SpeedButtonDown: TSpeedButton;
SpeedButtonRight: TSpeedButton;
SpeedButtonZoomIn: TSpeedButton;
SpeedButtonZoomOut: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Splitter1: TSplitter;
procedure FormCreate(Sender: TObject);
procedure ImageEnView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ImageEnView1Resize(Sender: TObject);
procedure ImageEnMView1ImageSelect(Sender: TObject; idx: Integer);
procedure SpeedButtonZoomInClick(Sender: TObject);
procedure SpeedButtonZoomOutClick(Sender: TObject);
procedure SpeedButtonLeftClick(Sender: TObject);
procedure SpeedButtonRightClick(Sender: TObject);
procedure SpeedButtonUpClick(Sender: TObject);
procedure SpeedButtonDownClick(Sender: TObject);
procedure ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ImageEnView1DrawBackBuffer(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure MapBeginWork(Sender: TObject);
procedure MapFinishWork(Sender: TObject);
private
{ Private declarations }
map: TIESlippyMap;
mouseDownPoint: TPoint;
mouseDownCoords: TIE2DPoint;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses
ims, ShellApi;
{$R *.dfm}
{$R WindowsTheme.res}
procedure TMainForm.FormCreate(Sender: TObject);
begin
// Note: The MapQuest service has been discontinued
map := TIESlippyMap.Create(iesmpOSM_Mapnik, 'cache');
map.OnBeginWork := MapBeginWork;
map.OnFinishWork := MapFinishWork;
map.Zoom := 4;
ImageEnMView1.SoftShadow.Enabled := true;
ImageEnMView1.FillFromDirectory('images', -1, false, '', false, '', False, false);
ImageEnMView1.SelectAll();
ImageEnMView1ImageSelect(self, 0);
ImageEnView1.LegacyBitmap := false;
ImageEnView1.IEBitmap.VirtualBitmapProvider := map;
ImageEnView1Resize(self);
end;
procedure TMainForm.ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
xbmp, ybmp: integer;
begin
xbmp := ImageEnView1.XScr2Bmp(X);
ybmp := ImageEnView1.YScr2Bmp(Y);
mouseDownPoint := Point(xbmp, ybmp);
mouseDownCoords := IE2DPoint(map.Longitude, map.Latitude);
end;
procedure TMainForm.ImageEnView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
xbmp, ybmp: integer;
begin
xbmp := ImageEnView1.XScr2Bmp(X);
ybmp := ImageEnView1.YScr2Bmp(Y);
StatusBar1.SimpleText := Format('Latitude: %3.8f, Longitude: %3.8f',
[map.BmpYToLatitude(ybmp), map.BmpXToLongitude(xbmp)]);
if ImageEnView1.MouseCapture then
begin
// drag map
map.Longitude := map.BmpXToLongitude( map.LongitudeToBmpX(mouseDownCoords.X) + (mouseDownPoint.X - xbmp) );
map.Latitude := map.BmpYToLatitude( map.LatitudeToBmpY(mouseDownCoords.Y) + (mouseDownPoint.Y - ybmp) );
ImageEnView1.Update();
end;
end;
// TImageEnView resized
procedure TMainForm.ImageEnView1Resize(Sender: TObject);
var
bmpw, bmph: integer;
begin
bmpw := ImageEnView1.Width;
bmph := ImageEnView1.Height;
ImageEnView1.IEBitmap.Allocate(bmpw, bmph);
map.PointPosition := Point(bmpw div 2, bmph div 2);
ImageEnView1.Update();
end;
// selected image
procedure TMainForm.ImageEnMView1ImageSelect(Sender: TObject; idx: Integer);
begin
with ImageEnMView1.MIO.Params[idx] do
begin
Label2.Caption := Format('Latitude: %3.8f (%s), Longitude: %3.8f (%s)', [EXIF_GPSLatitude,
EXIF_GPSLatitude_Str,
EXIF_GPSLongitude,
EXIF_GPSLongitude_Str]);
map.Latitude := EXIF_GPSLatitude;
map.Longitude := EXIF_GPSLongitude;
end;
ImageEnView1.Update();
end;
// Zoom-in
procedure TMainForm.SpeedButtonZoomInClick(Sender: TObject);
begin
map.Zoom := map.Zoom + 1;
ImageEnView1.Update();
end;
// Zoom-out
procedure TMainForm.SpeedButtonZoomOutClick(Sender: TObject);
begin
if map.Zoom > 0 then
begin
map.Zoom := map.Zoom - 1;
ImageEnView1.Update();
end;
end;
// left
procedure TMainForm.SpeedButtonLeftClick(Sender: TObject);
begin
map.Longitude := map.BmpXToLongitude( map.LongitudeToBmpX(map.Longitude) - 64 );
ImageEnView1.Update();
end;
// right
procedure TMainForm.SpeedButtonRightClick(Sender: TObject);
begin
map.Longitude := map.BmpXToLongitude( map.LongitudeToBmpX(map.Longitude) + 64 );
ImageEnView1.Update();
end;
// up
procedure TMainForm.SpeedButtonUpClick(Sender: TObject);
begin
map.Latitude := map.BmpYToLatitude( map.LatitudeToBmpY(map.Latitude) - 64);
ImageEnView1.Update();
end;
// down
procedure TMainForm.SpeedButtonDownClick(Sender: TObject);
begin
map.Latitude := map.BmpYToLatitude( map.LatitudeToBmpY(map.Latitude) + 64);
ImageEnView1.Update();
end;
procedure TMainForm.ImageEnView1DrawBackBuffer(Sender: TObject);
var
i: integer;
idx: integer;
lat, lon: double;
x, y: integer;
begin
for i := 0 to ImageEnMView1.MultiSelectedImagesCount - 1 do
begin
idx := ImageEnMView1.MultiSelectedImages[i];
lat := ImageEnMView1.MIO.Params[idx].EXIF_GPSLatitude;
lon := ImageEnMView1.MIO.Params[idx].EXIF_GPSLongitude;
x := map.LongitudeToBmpX(lon);
y := map.LatitudeToBmpY(lat);
with TIEBitmap.Create(@marker[0], marker_Size) do
begin
RenderToTBitmapEx(ImageEnView1.BackBuffer, x - marker_spot_x, y - marker_spot_y, 64, 64, 0, 0, Width, Height, 255, rfNone);
Free();
end;
end;
end;
procedure TMainForm.Label3Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar('http://www.imageen.com'), nil, nil, SW_MAXIMIZE);
end;
// Before downloading tiles
procedure TMainForm.MapBeginWork(Sender: TObject);
begin
Screen.Cursor := crHourglass;
end;
// After downloading tiles
procedure TMainForm.MapFinishWork(Sender: TObject);
begin
Screen.Cursor := crDefault;
end;
end.