Вопросы по исходному коду

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

Re: Вопросы по исходному коду

Сообщение vdemidov »

garl писал(а):TDownloadRequest.Create(
VLink,
VHeader,
AInetConfig.GetStatic
);

имеем VHeader - AnsiString
есть необходимость передавать куки больше 255 символов.
на сколько трудно и где рыть? или есть другие варианты в запрос передать отдельно куки большого размера?
Передвай. Там до 2 гигабайт можно. Это обычная строка однобайтовых символов с терминальным нулем.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Dopect
Новичок
Сообщения: 5
Зарегистрирован: 01 фев 2018, 19:35

Re: Вопросы по исходному коду

Сообщение Dopect »

Как уже не раз говорили проект огромный, нету комментов(минимум), много интерфейсов... и прочее, сложно понять общую картину проекта. Искал класс или метод который конвертирует [lat,lng] в [z,x,y], во время скачки и/или после для чтения из кеша. Сам кроме LatLng2RelativeInternal ничего не нашел, да и тот что "внутреннее выдает" в пределах [0-1]. Сперва хотел исользовать код от гугла, потом нашел и другие, но все дают неправильные координаты тайла для заданного [lat,lng]. Точнее такой результат:
cache\map\z19\173\x177383\97\y100095.png // правильный
cache\map\z19\173\x177206\97\y100134.png

Вопрос: Какой класс или метод который конвертирует [lat,lng] в [z,x,y], во время скачки и/или после для чтения из кеша?
В частности интересует EPSG=3785.
скрытый текст: показать
Что? Зачем? Для чего? Хочу написать свой mapControl на WPF который будет использовать существующий кеш. Застрял на этом месте. Создал тему с описанием этой же проблемы в этой ветке форума, на след. день "кто-то" удалил. Сейчас вижу "кто-то" обратно вернул, спасибо.
Upd. Хорошо, вопрос с приведением кода.
Входные [lon = 63.355570, lat = 39.054670] подаю на следующую функцию:

Код: Выделить всё

function TProjectionTypeMercatorOnSphere.LonLat2RelativeInternal(
  const APoint: TDoublePoint
): TDoublePoint;
var
  z, c: Extended; { Extended is a Pascal type that will hold an extended floating point value.}
begin
  Result.x := 0.5 + APoint.x / 360;
  z := Sin(APoint.y * Pi / 180);
  c := 1 / (2 * Pi);
  Result.y := 0.5 - 0.5 * Ln((1 + z) / (1 - z)) * c;
end;
результат подаю на эту:

Код: Выделить всё

function TProjectionBasic256x256.InternalRelative2TilePosFloat(
  const APoint: TDoublePoint
): TDoublePoint;
begin
  Result := DoublePoint(APoint.X * FTilesFloat, APoint.Y * FTilesFloat);
end;
на выходе одно и тоже по X RelInt2TilePos Coords X:177206,118172444
по Y: 117636,115362263 съезжает еще дальше.
Переформулирую вопрос:
Где или как программа сглаживает эту неточность/погрешность расчета координат тайла?
Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

Re: Вопросы по исходному коду

Сообщение vdemidov »

Читаем внимательно название класса TProjectionTypeMercatorOnSphere - Меркатор на СФЕРЕ
А если вас интересует EPSG=3785, то это Меркатор на Эллипсоиде - TProjectionTypeMercatorOnEllipsoid совсем другой класс, совсем другой алгоритм пересчета
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Dopect
Новичок
Сообщения: 5
Зарегистрирован: 01 фев 2018, 19:35

Re: Вопросы по исходному коду

Сообщение Dopect »

Верно, код EPSG неправильный. В коде что копипастил есть такой коммент:

Код: Выделить всё

 //Converts XY point from (Spherical) Web Mercator EPSG:3785 (unofficially EPSG:900913) to lat/lon in WGS84 Datum
        public static Point MetersToLatLon(Point m)
        {
            var ll = new Point();
            ll.X = (m.X / OriginShift) * 180.0;
            ll.Y = (m.Y / OriginShift) * 180.0;
            ll.Y = 180.0 / Math.PI * (2 * Math.Atan(Math.Exp(ll.Y * Math.PI / 180.0)) - Math.PI / 2.0);
            return ll;
        }
С этого (от gdal) коммента запомнил код и в других местах не обращал вниамание.
До того как начать новую тему пробовал и эллиптический, у него результат еще больше далек от правильного:
RelInt2TilePos Coords X:177206,306042311 Y: NaN
Только по Y разница пересчета, точнее функции обеих классов отличаются одной строкой:

Код: Выделить всё

Result.y := (0.5 - c * (ArcTanh(z) - FExct * ArcTanh(FExct * z))); [i]        // эллиптический[/i]
Result.y := 0.5 - 0.5 * Ln((1 + z) / (1 - z)) * c;  [i]                                  // сферический[/i]
При sradiusa = sradiusb результат вычисления по эллиптическому одинаковый со сферическим, но стоит задать sradiusb=6356752.3142 и Y получается NaN для эллиптического.

Может Params.txt неверный?

Код: Выделить всё

[PARAMS]
pnum=2
GUID={CBA03063-23D9-4FA4-931A-9182B98644B1}
name_ru=Карта (Google)
name=Map (Google)
name_uk=Карта (Google)
ParentSubMenu=Google
DefURLBase=http://mt.google.com/vt/lyrs=m@169000000&hl=ru
projection=1
sradiusa=6378137
sradiusb=6378137
NameInCache=map
Ext=.png
DefHotKey=77
ContentType=image/png
[ViewInfo] 
EPSG=3785
Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

Re: Вопросы по исходному коду

Сообщение vdemidov »

Конкретно какой вопрос по коду САС.Планеты? То что у вас где-то ошибка мы уже поняли, но это форум посвящен разработке САС.Планеты, поэтому ваш вопрос оффтопик.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Dopect
Новичок
Сообщения: 5
Зарегистрирован: 01 фев 2018, 19:35

Re: Вопросы по исходному коду

Сообщение Dopect »

Конкретный вопрос на первом посте задавал, но для вас это оффтоп потому просто указали на ошибку кода EPSG и отвернулись.
На втором посте показал что не до конца знаю весь проект, ибо по коду с инета и по коду самого проекта координаты тайлов не совпадают, одинаково неверные. Потому подумал может я что-то упустил в проекте, ту часть где происходит "финальный пересчет". Написал вопрос в эту тему в надежде что кто нибудь укажет на то что я упускаю. Зная проблему указать на него парами строк ничего не стоит. Разрабы поднявшие сей проект(включая вас?) знают кодовую часть лучше всех.
Нуда лады, сам как нидь разберусь.
Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

Re: Вопросы по исходному коду

Сообщение vdemidov »

Dopect писал(а): часть где происходит "финальный пересчет"

Нет никакого финального пересчета.
Dopect писал(а):Нуда лады, сам как нидь разберусь.
Будут конкретные вопросы по коду САСа - задавайте
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
lambda88
Новичок
Сообщения: 6
Зарегистрирован: 18 окт 2017, 08:08
Благодарил (а): 2 раза

Re: Вопросы по исходному коду

Сообщение lambda88 »

Добрый день. Подскажите, пожалуйста, какой файл в исходном коде отвечает за прорисовку полигонов на карте. Потихоньку пытаюсь разобраться в программе и решил начать с полигонов.
Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

Re: Вопросы по исходному коду

Сообщение vdemidov »

lambda88 писал(а):Добрый день. Подскажите, пожалуйста, какой файл в исходном коде отвечает за прорисовку полигонов на карте.
Векторные данные меток рендерятся в растр в модуле u_VectorTileRendererForMarks.pas
А векторыне тайлы типа викимапии в модуле u_VectorTileRenderer.pas
lambda88 писал(а):Потихоньку пытаюсь разобраться в программе и решил начать с полигонов.
Не самая простая часть программы :)
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
lambda88
Новичок
Сообщения: 6
Зарегистрирован: 18 окт 2017, 08:08
Благодарил (а): 2 раза

Re: Вопросы по исходному коду

Сообщение lambda88 »

Спасибо!
vdemidov писал(а):Не самая простая часть программы :)
Не самая простая, но для проекта нужная)))
Ответить

Вернуться в «Раздел для разработчиков программы SAS.Планета»