Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Sergey_Despot
Contributor III
Contributor III

Пересчет координат для использования подложки Яндекс Карт (yandex maps)

Представленная ниже процедура берет координаты в формате GeoMakePoint из целевой таблицы и добавляет альтернативные координаты для использования подложки Яндекс карт

sub getGeo_Yandex(Tb, F1, F2)
Trace Пересчет координат происходит по полю $(F1) сформированное через GeoMakePoint;
tmp_geo:
Load Distinct
[$(F1)]
Resident [$(Tb)]
where len(trim([$(F1)])) > 0;
For r = 1 to NoOfRows('tmp_geo')
ID = Peek('ID', $(r)-1, 'tmp_geo');
vGeo = Peek('Geo', $(r)-1, 'tmp_geo');
Trace vGeo: $(vGeo);
vLat = SubField(Replace(Replace('$(vGeo)', '[', ''), ']', ''), ',', 2)
vlng = SubField(Replace(Replace('$(vGeo)', '[', ''), ']', ''), ',', 1);

//Пересчет координат из широты/долготы в проекцию Меркатора/WGS84
if $(vLat) > 89.5 then
vLat = 89.5
end if;
if $(vLat) < -89.5 then
vLat = -89.5
end if;

rLat = vLat * pi()/180; //медиана
rLong = vlng * pi()/180;//медиана

cA=6378137.0
cB=6356752.3142
cF=(cA-cB)/cA
cE=sqrt(2*cF-pow(cF,2))
x=cA*rLong
y=cA*log(tan(pi()/4+rLat/2)*pow(((1-cE*sin(rLat))/(1+cE*sin(rLat))),(cE/2)))

//Пересчет координат из "Сферического Меркатора" в проекцию широты/долготы
vLat_Y = (2 * atan(exp((y) / cA)) - pi() / 2) * 180/pi()
vLong_Y = (x / cA) * 180/pi()
tmp_geo_Y:
Load
'$(vGeo)' as [$(F1)],
GeoMakePoint(Replace('$(vLat_Y)',',','.'),Replace('$(vLong_Y)',',','.')) as [$(F2)]
AutoGenerate 1;

vGeo = Null();
vLat = Null();
vlng = Null();
rLat = Null();
rLong = Null();
cA = Null();
cB = Null();
cF = Null();
cE = Null();
x = Null();
y = Null();
vLat_Y = Null();
vLong_Y = Null();
next;


Left Join ([$(Tb)])
Load
[$(F1)],
[$(F2)]
Resident tmp_geo_Y;
Drop Tables tmp_geo, tmp_geo_Y;
EndSub;

Пример использования:

1. Исходные данные:

map:
Load * Inline [
ID, lat, lng, address
Кр.площадь, 55.754193, 37.620752, 'Россия, Москва, Красная площадь'
];

Left Join
Load ID, GeoMakePoint(Replace(lat,',','.'),Replace(lng,',','.')) as Geo
Resident map;

Call getGeo_Yandex('map', 'Geo', 'Geo_Ya');

На выходе получаем поле Geo_Ya с пересчитанными координатами

2. Берем объект Карта и добавляем фоновый слой 

Формат: TMS

Адрес URL: ='http://vec04.maps.yandex.net/tiles?l=map&x={x}&y={y}&z={z}&lang=ru-RU'

3. Создаем слой точек

Измерение: ID

Местоположение: Geo_Ya

Sergey_Despot_0-1600343503117.png

 

Labels (2)
0 Replies