[[главная|Главная страница]] [[функции_программы|Функции программы]] ====== Описание скриптов 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.