View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0003610 | SAS.Планета | Хотелка / Feature request | public | 22-01-2020 15:48 | 20-02-2021 23:14 |
| Reporter | zed | Assigned To | zed | ||
| Priority | normal | Severity | minor | Reproducibility | have not tried |
| Status | resolved | Resolution | fixed | ||
| Product Version | 191221 | ||||
| Target Version | 200606 | Fixed in Version | 200606 | ||
| Summary | 0003610: PascalScript: Добавить функцию получения Url из шаблона | ||||
| Description | В свежем PR#27 пришли zmp со вспомогательным скриптом, реализующем логику получения url из шаблона:Предлагаю добавить в SAS некую функцию "TemplateToUrl" которая будет выполнять все нужные замены и избавит от необходимости таскать этот скрипт в каждом zmp. | ||||
| Tags | No 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.
| ||||
|
|
А я бы предложил подумать о том, что бы сделать по какому-то ключу в params.txt создание другого урл-генератора чисто по такому шаблону. Вообще без запуска PascalScript. |
|
|
Да, я думаю что можно сделать так, что если файла GetUrlScript нету вообще, то генерировать url из этого шаблона. А если файл есть, то просто предоставлять такую функцию (мало ли нужно куки какие обновлять или ещё что). В коде это будет жить всё в одном месте, но будет заложено вот такое вариативное поведение. |
|
|
Нормальный вариант. Главное хорошо и непротиворечиво плейсхолдеры продумать. Еще версия нужна и текущий язык (на всякий случай) |
|
|
Первые 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 |
|
|
С переменной для языка возник вопрос. В запросах обычно фигурирует такой формат: "en_US", "ru_RU", а у нас же в переменной просто "en" или "ru". Надо делать какое-то сопоставление или что? |
|
|
Закончил, можно тестировать. В скрипты добавлена функция
которая из шаблона генерирует url. Если файла GetUrlScript.txt нету или он пуст (в том числе не содержит ни пробелов, ни переводов строк), происходит автоматическое генерирование url, так, как-будто выполняется вот такой скрипт:
В качестве параметров для замены доступны все параметры из описания тикета, плюс 2 параметра {lang} и {ver} (язык и версия, соответственно). Если нужны ещё какие-то параметры, пишите - добавлю. nnngrach В комментариях к скрипту я вижу вы столкнулись с тем, что некоторые функции не работают или работают не так как надо - не плохо бы открыть соответствующие тикеты по этому поводу, возможно это можно как-то починить. |
|
|
Работает, спасибо! Надо теперь не забыть в Wiki про новые теги написать. |
| 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 |