Здравствуйте. Я в своей программе подключаюсь к геопорталу. Захотелось реализовать "умное масштабирование" по колесику мыши. Использовал код из примера fndobj:
Код
procedure TfrmFind.mvMapMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
var
pScale1, iold : integer;
begin
Handled := true;
iold := mvMap.ViewScale;
If (iold <= 2000)
then pScale1 := iold - 50
else If (iold > 2000) and (iold <= 20000)
then pScale1 := iold - 500
else If (iold > 20000) and (iold <= 50000)
then pScale1 := iold - 1000
else If (iold > 50000) and (iold <= 500000)
then pScale1 := iold - 5000
else pScale1 := iold - 10000;
mvMap.ScaleInPoint((pScale1), nil);
end;
Но масштаб не хочет корректно меняться. Более того, если для геопортала установить знаменатель масштаба 6000, он устанавливается в 5652. Почему такое происходит? Методом проб и ошибок выяснил, что изменение масштаба для геопорталов всегда работает только при его увеличении/уменьшении в 2 раза (* или div 2). При использовании TMapManager такая же беда: масштаб корректно меняется только по клавишам <;>, а при прокрутке мышью с зажатой клавишей ctrl, масштаб не меняется.
Геопорталы при работе с тайлами отдают изображение карты в заранее определенных масштабах, которые отличаются друг от друга в 2 раза. Поэтому отобразить карту в такой ситуации в произвольном масштабе не получится.
Масштабный ряд зависит от параметров монитора и масштабного коэффициента. Поэтому на разных мониторах он может быть разным. Если геопортал является тайловым (WMTS), то он всегда отображается по определённым масштабным коэффициентом. Список машстабных коэффициентов описан в файле crsregister.xml для каждой матрицы тайлов. Разные геопорталы могут использовать разные матрицы тайлов. Поэтому заранее созданного списка масштабов нет. Он всегда формируется динамически на основании текущих параметров. Запросить текущий реальный масштаб отображения можно функцией mapGetRealShowScale. Чтобы узнать какой масштаб установиться, возможно воспользоваться функцией wmsGetWMTSScale, идентификатор данных можно получить функцией mapGetHWMS Для геопорталов по стандарту (WMS) можно выставить любой масштаб.