Файл GetUrlScript.txt содержит скрипт, написанный на Pascal, и предназначен для формирования параметров запроса тайла, к которым относятся:
полный адрес ссылки на тайлы данной карты;
HTTP-заголовки, передаваемые серверу при запросе тайла карты.
Переменные, доступные в скриптах:
GetURLBase (String) — неизменная часть адреса ссылки на тайлы карты, соответствует параметру DefURLBase в params.txt
RequestHead (String) — заголовки, которые будут переданы серверу при запросе (проинициализирована значением RequestHead из params.txt)
Version (String) — версия тайлов, соответствует параметру Version в params.txt
Lang (String) — язык, соответствует языку интерфейса программы. Принимает значения 'en', 'ru', 'uk'
GetX, GetY, GetZ (Integer) — соответственно номер тайла по горизонтали (слева), по вертикали (сверху), масштаб (от 1 до 24)
GetLLon, GetRLon, GetTLat, GetBLat (Double) — соответственно долгота левой границы тайла, правой границы, широта верхней границы, нижней границы
GetLMetr, GetRMetr, GetTMetr, GetBMetr (Double) — то же в метрах
ResponseHead (String) — заголовки ответа сервера от предыдущего запроса
ScriptBuffer (String) — буфер, любая информация передаваемая между скриптами
ResultURL (String) — сюда нужно сформировать ссылку на тайл
PostData (String) — если в скрипте в строковую переменную PostData поместить какие-то данные, то будет выполнен POST запрос вместо GET запроса.
Функции для работы со строками, доступные в скриптах:
function Pos(const SubStr, Str: String): Integer;
function Copy(Str: String; StartPos, Count: Integer): String;
function Length(const Str: String): Integer;
function GetAfter(SubStr, Str: String): String;
function GetBefore(SubStr, Str: String): String;
function GetBetween(Str, After, Before: String): String;
function SubStrPos(const Str, SubStr: AnsiString; FromPos: Integer): Integer;
function RegExprGetMatchSubStr(const Str, MatchExpr: String; MatchID: Integer): String;
function RegExprReplaceMatchSubStr(const Str, MatchExpr, Replace: String): String;
function SetHeaderValue(Headers, Name, Value: String): String;
function GetHeaderValue(Headers, Name: String): String;
Функции для кодировани/декодирования Base64:
function Base64Encode(const Data: AnsiString): AnsiString;
function Base64UrlEncode(const Data: AnsiString): AnsiString;
function Base64Decode(const Data: AnsiString): AnsiString;
Другие доступные функции:
function Random(Value: Integer): Integer;
function GetUnixTime: Int64;
function RoundEx(Value: Double; Precision: Integer): String;
function IntPower(const Base: Extended; const Exponent: Integer): Extended register;
function IntToHex(Value: Integer; Digits: Integer): String;
Выполнение HTTP запросов из скрипта
В Zmp должно быть включена возможность выполнять http запросы IsUseDownloaderInScript=1
В скрипте можно пользоваться переменной Downloader, если она не пустая, то можно выполнять DoHttpRequest
Например так:
var
VRequestUrl, VRequestHeader, VPostData: string;
VResponseCode: Cardinal;
VResponseHeader, VResponseData: string;
begin
if (Downloader <> nil) 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.
Работа с хитрыми системами координат
Если в папке с программой присутствует proj480.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.