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.