Страница 5 из 5

Re: lonlatarr="ADDdJAaB...b8EQAAwX" ...

СообщениеДобавлено: 03 апр 2015, 14:52
Banzay
zed писал(а):Это было очень неудачное решение на заре развития программы. Писать её начинали студенты-программисты, поэтому вот такое наследие: и мусорные 4 байта и монструозный Extended.

Благодарю за пояснение! Понимаю, что всегда бывают недочеты, приятно, что при их наличии SAS.Планета разрослась в такой полезный и многофункциональный инструмент! Жалко, только, что для реализации различных ярлыков на карте нельзя использовать KMZ-файлы, в силу не полной поддержи их средствами SAS.Планета. Из-за этого пришлось изобретать велосипед, хотя можно было проще реализовывать задачу средствами стороннего ПО. :)

Не прошло и года... вроде как удалось победить lonlatarr

СообщениеДобавлено: 03 апр 2015, 19:53
Cheetos
1. В uses добавляем EDBase64
2. Объявляем следующие типы:
Код: Выделить всё
type
  TExtendedPoint = packed record
    X: Extended;
    Y: Extended;
    Reserved: LongWord;
  end;

type
  TDoublePoint = record
    X: Double;
    Y: Double;
  end;

3. Юзаем функцию LonLatArr, где в качестве параметра передаем координаты точки в градусах:
Код: Выделить всё
function LonLatArr(DP: TDoublePoint): String;
var
  AStream: TMemoryStream;
  S: AnsiString;
  ExtPoint: TExtendedPoint;
begin
  try
    AStream:=TMemoryStream.Create;
    ExtPoint.X := DP.X;
    ExtPoint.Y := DP.Y;
    ExtPoint.Reserved:=0;
    AStream.Write(ExtPoint, SizeOf(ExtPoint));
    AStream.Position:=0;
    SetString(S, PAnsiChar(AStream.Memory), AStream.Size);
    Result:=Base64Encode(S);
  finally
    AStream.Free;
  end;
end;

Re: lonlatarr="ADDdJAaB...b8EQAAwX" ...

СообщениеДобавлено: 03 апр 2015, 20:03
Cheetos
to zed:
1. Выражаю огромную благодарность за оказанную помощь.
2. В отношении директивы {$A4} для решения конкретной задачи - она не обязательна - packed record ее игнорирует.

Re: lonlatarr="ADDdJAaB...b8EQAAwX" ...

СообщениеДобавлено: 03 апр 2015, 20:17
Cheetos
Banzay писал(а):
zed писал(а):Это было очень неудачное решение на заре развития программы. Писать её начинали студенты-программисты, поэтому вот такое наследие: и мусорные 4 байта и монструозный Extended.

Благодарю за пояснение! Понимаю, что всегда бывают недочеты, приятно, что при их наличии SAS.Планета разрослась в такой полезный и многофункциональный инструмент! Жалко, только, что для реализации различных ярлыков на карте нельзя использовать KMZ-файлы, в силу не полной поддержи их средствами SAS.Планета. Из-за этого пришлось изобретать велосипед, хотя можно было проще реализовывать задачу средствами стороннего ПО. :)

Можно :)

Re: lonlatarr="ADDdJAaB...b8EQAAwX" ...

СообщениеДобавлено: 03 апр 2015, 22:28
zed
Banzay писал(а):нельзя использовать KMZ-файлы, в силу не полной поддержи их средствами SAS.Планета

Ну так присылайте пул-реквесты, глядишь и поддержка появится ;)
Cheetos писал(а):3. Юзаем функцию LonLatArr

По-моему, можно проще:
Код: Выделить всё
function LonLatArr(DP: TDoublePoint): String;
var
  ExtPoint: TExtendedPoint;
begin
  ExtPoint.X := DP.X;
  ExtPoint.Y := DP.Y;
  ExtPoint.Reserved := 0;
  Result := Base64Encode(PAnsiChar(@ExtPoint), SizeOf(ExtPoint));
end;

Но это если всего одна точка. А вообще, имейте в виду, что SAS умеет оперировать мультиполигонами и полилиниями (особенно это стоит учитывать при чтении lonlatarr, а то могут быть сюрпризы). Код сериализации геометрии живёт в юните Src/MarksDB/SML/u_GeometryToStreamSML.pas, десериализация: Src/MarksDB/SML/u_GeometryFromStreamSML.pas

Re: lonlatarr="ADDdJAaB...b8EQAAwX" ...

СообщениеДобавлено: 03 апр 2015, 23:42
Cheetos
zed писал(а):По-моему, можно проще:
Код: Выделить всё
function LonLatArr(DP: TDoublePoint): String;
var
  ExtPoint: TExtendedPoint;
begin
  ExtPoint.X := DP.X;
  ExtPoint.Y := DP.Y;
  ExtPoint.Reserved := 0;
  Result := Base64Encode(PAnsiChar(@ExtPoint), SizeOf(ExtPoint));
end;

Совершенству нет предела :)

zed писал(а):Но это если всего одна точка. А вообще, имейте в виду, что SAS умеет оперировать мультиполигонами и полилиниями (особенно это стоит учитывать при чтении lonlatarr, а то могут быть сюрпризы).

В рамках поставленной задачи (получение строки LonLatArr из координат точки) этого более чем достаточно

Re: lonlatarr="ADDdJAaB...b8EQAAwX" ...

СообщениеДобавлено: 11 окт 2019, 10:35
OverPaw
Cheetos, zed, спасибо за алгоритм, но непосредственно сам ваш код в FreePascal у меня не заработал.
Пришлось немного допилить - взять что-то от каждого и адаптировать к встроенной библиотеке Base64.
Привожу рабочий вариант для FreePascal 3.0.4 с примером конвертации координат.
Код: Выделить всё
uses Base64;

type
  TExtendedPoint = packed record
    X: Extended;
    Y: Extended;
    Reserved: LongWord;
  end;

type
  TDoublePoint = record
    X: Double;
    Y: Double;
  end;

function LonLatArr(DP: TDoublePoint): String;
var
  S: AnsiString;
  ExtPoint: TExtendedPoint;
begin
    ExtPoint.X := DP.X;
    ExtPoint.Y := DP.Y;
    ExtPoint.Reserved:=0;
    SetString(S, PAnsiChar(@ExtPoint), SizeOf(ExtPoint));
    LonLatArr := EncodeStringBase64(S);
end;

var
  lonlat: TDoublePoint;
begin
  lonlat.X := 47.817875;
  lonlat.Y := 52.022758;
  writeln(LonLatArr(lonlat));
  readln();
end.