View Issue Details

IDProjectCategoryView StatusLast Update
0003610SAS.ПланетаХотелка / Feature requestpublic20-02-2021 23:14
Reporterzed Assigned Tozed  
PrioritynormalSeverityminorReproducibilityhave not tried
Status resolvedResolutionfixed 
Product Version191221 
Target Version200606Fixed in Version200606 
Summary0003610: PascalScript: Добавить функцию получения Url из шаблона
DescriptionВ свежем PR#27 пришли zmp со вспомогательным скриптом, реализующем логику получения url из шаблона:


Этот скрипт призван упростить добавление новых карт в SasPlanet.
Он избавит начинающих пользователей от необходимости программировать на Pascal,
чтобы вносить изменения в файл GetUrlScript.txt при добавлении каждой новой карты.

Теперь можно просто вставлять привычный URL с заглушками типа {x}, {y}, {z}
в поле DefURLBase из файла params.txt. На пример, так:

DefURLBase=http://{s:a,b,c}.tile.openstreetmap.org/{z}/{x}/{y}.png

Скрипт разрабатывали Nnngrach и Erelen

--- Список доступных параметров для автозамены:

{x} Номер тайла по оси X. (Как в картах OpenStreetMaps)
{y} Номер тайла по оси Y. (Как в картах OpenStreetMaps)
{z} Уровень приближения/зума. (Как в картах OpenStreetMaps)
{q} Номер тайла в системе QuadKey. (Как в картах Bing)
{-y} Инвертированный номер тайла по оси Y. (Как на сайте Nakarte)
{bbox} Координаты границ тайла. (Для WMS серверов)
{timeStamp} Текущее время в формате UnixTime. (Для карт с пробками)
{z+1} Уровень зума. (Для карт, хранящихся в формате SasPlanet)
{x/1024} Номер первой подпапки (Для карт, в формате SasPlanet)
{y/1024} Номер второй подпапки (Для карт, в формате SasPlanet)
{s:a,b,c} Буква или цифра с номером зеркала сервера.
             В данном случае - одна из букв (A,B,C), выбранная рандомно.
Предлагаю добавить в SAS некую функцию "TemplateToUrl" которая будет выполнять все нужные замены и избавит от необходимости таскать этот скрипт в каждом zmp.
TagsNo tags attached.
Attached Files
GetUrlScript.txt (7,315 bytes)   
// -----------------------------------------------------------------------------
// ---  ����������� ������� �� AnyGIS
// -----------------------------------------------------------------------------

// ���� ������ ������� �������� ���������� ��� ���� � SasPlanet. 
// �� ������� ������ ������������ �� ������������ �������������� �� Pascal,
// ���� ������ �������� � ���� GetUrlScript.txt ��� ���������� ������ ����� ����.
// ����� ����� ������ ������� ������ URL � ��������� ���� {x}, {y}, {z}
// � ���� DefURLBase �� ����� params.txt. �� ������, ���:
//
// DefURLBase=http://{s:a,b,c}.tile.openstreetmap.org/{z}/{x}/{y}.png


// ������ ������������ Nnngrach � Erelen

 


// --- ������ ������� ���������� �� ���������:

// {x}          ����� ����� �� ��� X. (��� � ����� OpenStreetMaps)
// {y}          ����� ����� �� ��� Y. (��� � ����� OpenStreetMaps)
// {z}          ������ ����������/����. (��� � ����� OpenStreetMaps)
// {q}          ����� ����� � ������� QuadKey. (��� � ����� Bing)
// {-y}         �������������� ����� ����� �� ��� Y. (��� �� ����� Nakarte)
// {bbox}       ��������� ����� �����. (�� WMS ��������)
// {timeStamp}  ������ ���� � ������� UnixTime. (�� ���� � ��������)
// {z+1}        ������ ����. (�� ����, ������ � ������� SasPlanet)
// {x/1024}     ����� ������ �������� (�� ����, � ������� SasPlanet)
// {y/1024}     ����� ������ �������� (�� ����, � ������� SasPlanet)
// {s:a,b,c}	����� ��� ����� � ������� ������� �������. 
//              � ������ ����� - ���� �� ���� (A,B,C), ������� ��������.



// ����� �� ������: ���� ������ ��������� � ���� ����, 
// �� ������� ����� ����� ��� � ����.

// �� ���� �����: ���� ������ ����� ���� ������, 
// �� ���� � ������ (� �����, � ���� Debug Output ) ������� ���:
//
// writeLn('Hello Sas.Planet!');








// -----------------------------------------------------------------------------
// --- 4. ������������� ������
// -----------------------------------------------------------------------------

// --- ��������, �������� �� ���� ������ �����?
function isContains(findingText: string; inSourceText: string) : boolean;
begin
	result := pos(findingText, inSourceText) <> 0;
end;


// --- ���������� �� ������� ��������� ������ ����� ������
// --- (���������� ������ ��������� � ��� �����-�� �� ����������)
function roundFor(sourceNumber: Double  ; digitAfterComma: integer) : string;
var
	intPart, floatPart : integer;
begin    
	intPart := floor(sourceNumber);
	floatPart := floor( (sourceNumber - intPart) * round(intPower(10, digitAfterComma)) )
	result := intToStr(intPart) + '.' + intToStr(floatPart)
end;


// --- ������� ����� ����� � ������� Quadkey (���������� � ����� Bing)
function getQuadkeyText(x: integer; y: integer; z: integer) : string;
var
	i, q : byte;
begin
	result:='';
	for i:=1 to z do begin
		q:=0;
		if x mod 2 = 1 then q := q + 1;
		if y mod 2 = 1 then q := q + 2;
		x := x div 2;
		y := y div 2;
		result := intToStr(q) + result;
	end;
end;




// -----------------------------------------------------------------------------
// --- 3. ���� ��������, �� ��������� �� �� ������� ������� 
// --- �� ����� ������� ���� {s: a,b,c}
// -----------------------------------------------------------------------------
type
	TSubst = record
		mask, val : string;
	end;
	TSubsts = record
		count : integer;
		s : array [0..15] of TSubst;
	end;


function replaceServerName(url: string) : string;
var
	s, ss : string;
	sarr : array [0..9] of string;
	sarr_l, p : integer;

begin
	s := RegExprGetMatchSubStr(url, '\{[sS]:([^}]+)\}', 0);
	if s <> '' then begin
		ss := s;
		ss := StringReplace(ss, '{s:', '', [rfIgnoreCase]);
		ss := StringReplace(ss, '}', '', [rfIgnoreCase]);
		ss := ss + ',';
		sarr_l := 0;
		while ss <> '' do begin
			p := pos(',', ss);
			if p = 0 then p := length(ss);
			sarr[sarr_l] := copy(ss, 1, p-1);
			sarr_l := sarr_l + 1;
			delete(ss, 1, p);
		end;
		url := StringReplace(url, s, sarr[random(sarr_l)], []);
	end;
	Result := url;
end;




// -----------------------------------------------------------------------------
// --- 2. ���� ��������, �� ������ � ��������� � ������ URL ������ 
// --- ����� ������ �� ����� ������� ���� {x}, {y}, {z}.
// -----------------------------------------------------------------------------
function replaceLeafletPlaceholders(urlTemplate: string; x: integer; y: integer; z: integer) : string;
var
	options: tReplaceFlags;
	calculatedValue: string;

begin
	options := [rfReplaceAll, rfIgnoreCase];
	result := urlTemplate;

	if isContains('{x}', result) then begin
		calculatedValue := intToStr(x);
		result := stringReplace( result, '{x}', calculatedValue, options)
	end;

	if isContains('{y}', result) then begin
		calculatedValue := intToStr(y);
		result := stringReplace( result, '{y}', calculatedValue, options)
	end;

	if isContains('{z}', result) then begin
		calculatedValue := intToStr(z-1);
		result := stringReplace( result, '{z}', calculatedValue, options)
	end;

	if isContains('{z+1}', result) then begin
		calculatedValue := intToStr(z);
		result := stringReplace( result, '{z+1}', calculatedValue, options)
	end;

	if isContains('{x/1024}', result) then begin
		calculatedValue := intToStr(x div 1024);
		result := stringReplace( result, '{x/1024}', calculatedValue, options)
	end;

	if isContains('{y/1024}', result) then begin
		calculatedValue := intToStr(y div 1024);
		result := stringReplace( result, '{y/1024}', calculatedValue, options)
	end;

	if isContains('{-y}', result) then begin
		calculatedValue := intToStr( round(intPower(2, z-1)) - 1 - y);
		result := stringReplace( result, '{-y}', calculatedValue, options)
	end;

	if isContains('{q}', result) then begin
		calculatedValue := getQuadkeyText(x, y, z);
		result := stringReplace( result, '{q}', calculatedValue, options)
	end;

	if isContains('{bbox}', result) then begin
        result := stringReplace( result, '{bbox}', '{Left},{Bottom},{Right},{Top}', options)
        result := stringReplace( result, '{Left}', roundFor(GetLMetr,8), options)
        result := stringReplace( result, '{Bottom}', roundFor(GetBMetr,8), options)
        result := stringReplace( result, '{Right}', roundFor(GetRMetr,8), options)
        result := stringReplace( result, '{Top}', roundFor(GetTMetr,8), options)
        // ���� ������ � �� ������� ������, ��� ��� ������ 
        // ������ ��� ����� ������� ��������� �����. 
        // �������� �����-�� ���������� �� ����.
	end;

	if isContains('{timeStamp}', result) then begin
		calculatedValue := IntToStr(GetUnixTime);
		result := stringReplace( result, '{timeStamp}', calculatedValue, options)
	end;
end;




// -----------------------------------------------------------------------------
// --- 1. ����� �������. �������� �������� URL-������ �����.
// --- ����� ���� �� ���������� URL.
// -----------------------------------------------------------------------------
begin
	resultURL := replaceLeafletPlaceholders(getURLBase, getX, getY, getZ);
	resultURL := replaceServerName(resultURL);	
end.
GetUrlScript.txt (7,315 bytes)   

Relationships

related to 0003669 resolvedzed В функцию создания url из шаблона, добавить плейсхолдер {sas_path} 

Activities

vdemidov

22-01-2020 17:35

manager   ~0019632

А я бы предложил подумать о том, что бы сделать по какому-то ключу в params.txt создание другого урл-генератора чисто по такому шаблону. Вообще без запуска PascalScript.

zed

22-01-2020 17:40

manager   ~0019633

Да, я думаю что можно сделать так, что если файла GetUrlScript нету вообще, то генерировать url из этого шаблона. А если файл есть, то просто предоставлять такую функцию (мало ли нужно куки какие обновлять или ещё что).

В коде это будет жить всё в одном месте, но будет заложено вот такое вариативное поведение.

vdemidov

22-01-2020 17:57

manager   ~0019634

Нормальный вариант. Главное хорошо и непротиворечиво плейсхолдеры продумать. Еще версия нужна и текущий язык (на всякий случай)

nnngrach

22-01-2020 21:22

reporter   ~0019635

Первые 5 плейсхолдеров (x y z q -y bbox) я брал из LeafLet: по моим наблюдениям, чаще всего используется именно такое написание. Думаю, их лучше оставить как есть.

Следующие 4 придумывал сам (timeStamp, z+1, x/1024, y/1024). Если нужно, то можно переименовывать, если есть идеи, на что именно.

Насчет последнего плейсходера {s:a,b,c}. Я думаю, гораздо удобней и привычней будет использовать вместо него стандартный ЛифЛетовский плейсхолдер {s}. А для ввода значений просто добавить новое поле в Params.txt. Например, такое:

ServerNames=a,b,c

zed

26-01-2020 09:49

manager   ~0019636

С переменной для языка возник вопрос. В запросах обычно фигурирует такой формат: "en_US", "ru_RU", а у нас же в переменной просто "en" или "ru". Надо делать какое-то сопоставление или что?

zed

26-01-2020 11:15

manager   ~0019637

Закончил, можно тестировать.

В скрипты добавлена функция

function TemplateToUrl(const ATmpl: string): string; 
которая из шаблона генерирует url. Если файла GetUrlScript.txt нету или он пуст (в том числе не содержит ни пробелов, ни переводов строк), происходит автоматическое генерирование url, так, как-будто выполняется вот такой скрипт:

begin
  ResultUrl := TemplateToUrl(GetURLBase);
end.

В качестве параметров для замены доступны все параметры из описания тикета, плюс 2 параметра {lang} и {ver} (язык и версия, соответственно).

Если нужны ещё какие-то параметры, пишите - добавлю.

nnngrach
В комментариях к скрипту я вижу вы столкнулись с тем, что некоторые функции не работают или работают не так как надо - не плохо бы открыть соответствующие тикеты по этому поводу, возможно это можно как-то починить.

nnngrach

31-01-2020 15:13

reporter   ~0019638

Last edited: 31-01-2020 15:14

Работает, спасибо!

Надо теперь не забыть в Wiki про новые теги написать.

Issue History

Date Modified Username Field Change
22-01-2020 15:48 zed New Issue
22-01-2020 15:49 zed File Added: GetUrlScript.txt
22-01-2020 15:50 zed Description Updated
22-01-2020 15:55 zed Description Updated
22-01-2020 17:35 vdemidov Note Added: 0019632
22-01-2020 17:40 zed Note Added: 0019633
22-01-2020 17:57 vdemidov Note Added: 0019634
22-01-2020 21:22 nnngrach Note Added: 0019635
25-01-2020 12:28 zed Assigned To => zed
25-01-2020 12:28 zed Status new => assigned
25-01-2020 12:28 zed Target Version => 211230
26-01-2020 09:49 zed Note Added: 0019636
26-01-2020 11:15 zed Note Added: 0019637
31-01-2020 15:13 nnngrach Note Added: 0019638
31-01-2020 15:14 nnngrach Note Edited: 0019638
01-02-2020 06:07 zed Status assigned => resolved
01-02-2020 06:07 zed Fixed in Version => 211230
01-02-2020 06:07 zed Resolution open => fixed
06-05-2020 06:44 zed Relationship added related to 0003669
01-06-2020 16:44 zed Target Version 211230 => 200606
01-06-2020 16:44 zed Fixed in Version 211230 => 200606
08-08-2025 13:24 zed Category Хотелка => Хотелка / Feature request