Содержание

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

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

Описание скриптов Pascal

Файл GetUrlScript.txt содержит скрипт, написанный на Pascal, и предназначен для формирования параметров запроса тайла, к которым относятся:

Переменные, доступные в скриптах:

Интерфейсные переменные, доступные в скриптах*:

Описание интерфейсов и примеры их использования см. ниже.

* - эти переменные могут быть не инициализированы (т.е. = nil). Перед использованием их необходимо проверять при помощи функции Assigned.

Функции и процедуры, доступные в скриптах:

Выполнение 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, то в скриптах будут доступны такие переменные

  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.