SASGIS

Веб-картография и навигация

SAS.Wiki

Веб-картография и навигация

Инструменты пользователя

Инструменты сайта


описание_паскаль_скриптов

Главная страница

Функции программы

Описание скриптов 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.
Перевод этой страницы: