Файл GetUrlScript.txt содержит скрипт, написанный на Pascal, и предназначен для формирования параметров запроса тайла, к которым относятся:
Переменные, доступные в скриптах:
Интерфейсные переменные, доступные в скриптах*:
Описание интерфейсов и примеры их использования см. ниже.
* - эти переменные могут быть не инициализированы (т.е. = nil). Перед использованием их необходимо проверять при помощи функции Assigned.
Функции и процедуры, доступные в скриптах:
В zmp должно быть включена возможность выполнять HTTP запросы IsUseDownloaderInScript=1
В скрипте можно пользоваться переменной Downloader, если она не пустая, то можно выполнять DoHttpRequest
ISimpleHttpDownloader = interface function DoHttpRequest( const ARequestUrl, ARequestHeader, APostData: AnsiString; out AResponseHeader, AResponseData: AnsiString ): Cardinal; end;
Пример:
var VRequestUrl, VRequestHeader, VPostData: string; VResponseCode: Cardinal; VResponseHeader, VResponseData: string; begin if Assigned(Downloader) then begin VRequestUrl := 'http://google.com/'; VRequestHeader := ''; VPostData := ''; VResponseHeader := ''; VResponseData := ''; VResponseCode := Downloader.DoHttpRequest(VRequestUrl, VRequestHeader, VPostData, VResponseHeader, VResponseData); if VResponseCode = 200 then begin ScriptBuffer := VResponseData; end else begin ScriptBuffer := VResponseHeader; end; end; end.
Если в папке с программой присутствует proj.dll, то в скриптах будут доступны такие переменные
IProjConverter = interface function LonLat2XY(const AProjLP: TDoublePoint): TDoublePoint; function XY2LonLat(const AProjXY: TDoublePoint): TDoublePoint; end;
будет инициализирована, если парметр Proj4Args в zmp-файле равен правильной строке инициализации библиотеки proj, иначе там будет nil.
IProjConverterFactory = interface function GetByEPSG(const AEPSG: Integer): IProjConverter; function GetByInitString(const AArgs: String): IProjConverter; end;
Позволяет создавать конвертеры по требованию, например с учетом зон и т. д.
Например так:
var VEPSG: Integer; Proj4Conv: IProjConverter; begin // use EPSG:28483 aka EPSG:2513 // check bounds (EPSG:28483 between 132E and 138E) and correct EPSG (inc or dec) VEPSG := 28483; if (GetLLon < 132) then begin VEPSG := VEPSG - 1; end else if (GetLLon > 138) then begin VEPSG := VEPSG + 1; end; // get proj4 converter Proj4Conv := ProjFactory.GetByEPSG(VEPSG - (28483 - 2513)); if Assigned(Proj4Conv) then begin // Тут генерируем Url end else begin // not available ResultURL := ''; end; end.
ICoordConverter = interface // Преобразует позицию тайла на заданном зуме в георафически координаты его верхнего левого угла function Pos2LonLat(const XY: TPoint; AZoom: byte): TDoublePoint; stdcall; // Преобразует георафические координаты в позицию тайла на заданном зуме накрывающего данные координаты function LonLat2Pos(const Ll: TDoublePoint; AZoom: byte): Tpoint; stdcall; // метрические координаты function LonLat2Metr(const Ll: TDoublePoint): TDoublePoint; stdcall; function Metr2LonLat(const Mm: TDoublePoint): TDoublePoint; stdcall; // Возвращает количество тайлов в заданном зуме function TilesAtZoom(const AZoom: byte): Longint; stdcall; // Возвращает общее количество пикселей на заданном зуме function PixelsAtZoom(const AZoom: byte): Longint; stdcall; // Преобразует позицию тайла заданного зума в координаты пиксела его левого верхнего угла function TilePos2PixelPos(const XY: TPoint; const AZoom: byte): TPoint; stdcall; // Преобразует позицию тайла заданного зума в номера пикселов его углов на заданном зуме function TilePos2PixelRect(const XY: TPoint; const AZoom: byte): TRect; stdcall; end;
Пример:
var VTilesCount: Integer; begin if Assigned(Converter) then begin VTilesCount := Converter.TilesAtZoom(GetZ); // производим расчёты и генерируем url end else begin ResultURL := ''; end; end.
Если файла GetUrlScript.txt нет или он пуст (в том числе не содержит ни пробелов, ни переводов строк), то будет выполнен скрипт, который автоматически заменяет плейсхолдеры найденные в GetURLBase. Именно в этом формате он применяется при упрощенном добавлении карт). Однако, если вам потребуется, то вы можете использовать эту функцию в собственных скриптах.
begin ResultUrl := TemplateToUrl(GetURLBase); end.