[[главная|Главная страница]]
[[функции_программы|Функции программы]]
====== Описание скриптов Pascal ======
Файл **GetUrlScript.txt** содержит скрипт, написанный на Pascal, и предназначен для формирования параметров запроса тайла, к которым относятся:
* полный адрес ссылки на тайлы данной карты;
* HTTP-заголовки, передаваемые серверу при запросе тайла карты.
Переменные, доступные в скриптах:
* **GetURLBase** (AnsiString) — неизменная часть адреса ссылки на тайлы карты, соответствует параметру DefURLBase в params.txt
* **RequestHead** (AnsiString) — заголовки, которые будут переданы серверу при запросе (проинициализирована значением RequestHead из params.txt)
* **Version** (AnsiString) — версия тайлов, соответствует параметру Version в params.txt
* **Lang** (AnsiString) — язык, соответствует языку интерфейса программы. Принимает значения 'en', 'ru', 'uk'
* **GetX, GetY, GetZ** (Integer) — соответственно номер тайла по горизонтали (слева), по вертикали (сверху), масштаб (от 1 до 24)
* **GetLLon, GetRLon, GetTLat, GetBLat** (Double) — соответственно долгота левой границы тайла, правой границы, широта верхней границы, нижней границы
* **GetLMetr, GetRMetr, GetTMetr, GetBMetr** (Double) — то же в метрах
* **ResponseHead** (AnsiString) — заголовки ответа сервера от предыдущего запроса
* **ScriptBuffer** (AnsiString) — буфер, любая информация передаваемая между скриптами
* **ResultURL** (AnsiString) — сюда нужно сформировать ссылку на тайл
* **PostData** (AnsiString) — если в скрипте в строковую переменную PostData поместить какие-то данные, то будет выполнен POST запрос вместо GET запроса
Интерфейсные переменные, доступные в скриптах*:
* **Downloader** (ISimpleHttpDownloader) — выполнение HTTP запросов внутри скрипта. Доступно только при включённой опции **IsUseDownloaderInScript** в params.txt
* **DefProjConverter** (IProjConverter) — конвертер координат в проекции, определённой в params.txt (параметр **Proj4Args**). Доступна только при наличии **proj.dll**
* **ProjFactory** (IProjConverterFactory) — фабрика, для создания конвертеров координат различных проекций. Доступна только при наличии **proj.dll**
* **Converter** (ICoordConverter) — набор функций для работы с координатами в текущей проекции
Описание интерфейсов и примеры их использования см. ниже.
* - эти переменные могут быть не инициализированы (т.е. = nil). Перед использованием их необходимо проверять при помощи функции **Assigned**.
Функции и процедуры, доступные в скриптах:
* function **Assigned**(const I: LongInt): Boolean;
* function **IntToStr**(const i: Int64): String;
* function **StrToInt**(const s: String): LongInt;
* function **StrToIntDef**(const s: String; const def: LongInt): LongInt;
* function **Copy**(const s: AnyString; const iFrom: LongInt; const iCount: LongInt): AnyString;
* function **Pos**(const SubStr: AnyString; const S: AnyString): LongInt;
* procedure **Delete**(var s: AnyString; const ifrom: LongInt; const icount: LongInt);
* procedure **Insert**(const s: AnyString; var s2: AnyString; const iPos: LongInt);
* function **GetArrayLength**(const arr): LongInt;
* procedure **SetArrayLength**(var arr; const count: LongInt);
* function **StrGet**(var S: String; const I: LongInt): Char;
* function **StrGet2**(const S: String; const I: LongInt): Char;
* procedure **StrSet**(const c: Char; const I: LongInt; var s: String);
* function **WStrGet**(var S: AnyString; const I: LongInt): WideChar;
* procedure **WStrSet**(const c: AnyString; const I: LongInt; var s: AnyString);
* function **VarArrayGet**(var S: Variant; const I: LongInt): Variant;
* procedure **VarArraySet**(const c: Variant; const I: LongInt; var s: Variant);
* function **AnsiUppercase**(const s: String): String;
* function **AnsiLowercase**(const s: String): String;
* function **Uppercase**(const s: AnyString): AnyString;
* function **Lowercase**(const s: AnyString): AnyString;
* function **Trim**(const s: AnyString): AnyString;
* function **Length**(const s): LongInt;
* procedure **SetLength**(var s; const NewLength: LongInt);
* function **Low**(const x): Int64;
* function **High**(const x): Int64;
* procedure **Dec**(var x);
* procedure **Inc**(var x);
* procedure **Include**(var s; const m);
* procedure **Exclude**(var s; const m);
* function **Sin**(const e: Extended): Extended;
* function **Cos**(const e: Extended): Extended;
* function **Sqrt**(const e: Extended): Extended;
* function **Round**(const e: Extended): LongInt;
* function **Trunc**(const e: Extended): LongInt;
* function **Int**(const e: Extended): Extended;
* function **Pi**: Extended;
* function **Abs**(const e: Extended): Extended;
* function **StrToFloat**(const s: String): Extended;
* function **FloatToStr**(const e: Extended): String;
* function **Padl**(const s: AnyString; const I: LongInt): AnyString;
* function **Padr**(const s: AnyString; const I: LongInt): AnyString;
* function **Padz**(const s: AnyString; const I: LongInt): AnyString;
* function **Replicate**(const c: Char; const I: LongInt): String;
* function **StringOfChar**(const c: Char; const I: LongInt): String;
* function **Unassigned**: Variant;
* function **VarIsEmpty**(const V: Variant): Boolean;
* function **Null**: Variant;
* function **VarIsNull**(const V: Variant): Boolean;
* function **VarType**(const V: Variant): Word;
* procedure **RaiseLastException**;
* procedure **RaiseException**(const Ex: TIFException; const Param: String);
* function **ExceptionType**: TIFException;
* function **ExceptionParam**: String;
* function **ExceptionProc**: LongWord;
* function **ExceptionPos**: LongWord;
* function **ExceptionToString**(const er: TIFException; const Param: String): String;
* function **StrToInt64**(const s: String): Int64;
* function **Int64ToStr**(const i: Int64): String;
* function **StrToInt64Def**(const s: String; const def: Int64): Int64;
* function **SizeOf**(const Data): LongInt;
* function **IDispatchInvoke**(const Self: IDispatch; const PropertySet: Boolean; const Name: String; const Par: !OPENARRAYOFVARIANT): Variant;
* function **Random**(const X: LongInt): LongInt;
* function **RandomRange**(const AFrom: LongInt; const ATo: LongInt): LongInt;
* function **RoundEx**(const chislo: Double; const Precision: LongInt): String;
* function **Power**(const Base: Extended; const Exponent: Extended): Extended;
* function **IntPower**(const Base: Extended; const Exponent: LongInt): Extended;
* function **IntToHex**(const Value: LongInt; const Digits: LongInt): String;
* function **Ceil**(const X: Extended): LongInt;
* function **Floor**(const X: Extended): LongInt;
* function **Log2**(const X: Extended): Extended;
* function **Ln**(const X: Extended): Extended;
* function **Max**(const A: LongInt; const B: LongInt): LongInt;
* function **MaxExt**(const A: Extended; const B: Extended): Extended;
* function **Min**(const A: LongInt; const B: LongInt): LongInt;
* function **MinExt**(const A: Extended; const B: Extended): Extended;
* function **GetAfter**(const SubStr: AnsiString; const Str: AnsiString): AnsiString;
* function **GetBefore**(const SubStr: AnsiString; const Str: AnsiString): AnsiString;
* function **GetBetween**(const Str: AnsiString; const After: AnsiString; const Before: AnsiString): AnsiString;
* function **SubStrPos**(const Str: AnsiString; const SubStr: AnsiString; const FromPos: LongInt): LongInt;
* function **RegExprGetMatchSubStr**(const Str: AnsiString; const MatchExpr: AnsiString; const AMatchID: LongInt): AnsiString;
* function **RegExprReplaceMatchSubStr**(const Str: AnsiString; const MatchExpr: AnsiString; const Replace: AnsiString): AnsiString;
* function **GetNumberAfter**(const ASubStr: AnsiString; const AText: AnsiString): AnsiString;
* function **GetDiv3Path**(const ANumber: AnsiString): AnsiString;
* function **StringReplace**(const S: AnsiString; const OldPattern: AnsiString; const NewPattern: AnsiString; const ReplaceAll: Boolean; const IgnoreCase: Boolean): AnsiString;
* function **SetHeaderValue**(const AHeaders: AnsiString; const AName: AnsiString; const AValue: AnsiString): AnsiString;
* function **GetHeaderValue**(const AHeaders: AnsiString; const AName: AnsiString): AnsiString;
* function **GetUnixTime**: Int64;
* function **SaveToLocalFile**(const AFullLocalFilename: AnsiString; const AData: AnsiString): LongInt;
* function **FileExists**(const FileName: AnsiString): Boolean;
* function **Base64Encode**(const Data: AnsiString): AnsiString;
* function **Base64UrlEncode**(const Data: AnsiString): AnsiString;
* function **Base64Decode**(const Data: AnsiString): AnsiString;
* function **TemplateToUrl**(const ATmpl: String): String;
===== Выполнение HTTP запросов из скрипта =====
В 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, то в скриптах будут доступны такие переменные
* переменная **DefProjConverter** с объектом типа:
IProjConverter = interface
function LonLat2XY(const AProjLP: TDoublePoint): TDoublePoint;
function XY2LonLat(const AProjXY: TDoublePoint): TDoublePoint;
end;
будет инициализирована, если парметр Proj4Args в zmp-файле равен правильной строке инициализации библиотеки proj, иначе там будет nil.
* переменная **ProjFactory** с объектом типа:
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.