Пользователи могут размещать карты и отдельные слои пространственных данных геопортала ИВМ СО РАН на своих веб-страницах.
Для этого нужно использовать программные интерфейсы (API) геопортала.
С технической точки зрения API геопортала - это набор JavaScript-компонентов для создания интерактивных карт.
Ниже представлен рабочий пример:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Карта</title>
<style>
#map {
width: 600px;
height: 400px;
}
</style>
<script type="text/javascript" src="http://gis.krasn.ru/maps/api/map.4.0.js"></script>
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Element.prototype.classList"></script>
<script type="text/javascript">
var map = null;
window.onload = function() {
map = new kuboMap.Map('map', {}, {}, { x: 194723, y: -3421722, zoom: 2, tile: 'base' });
}
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
Подключение библиотеки
Для подключения библиотеки добавьте следующую строку на Вашу страницу:
<script type="text/javascript" src="http://gis.krasn.ru/maps/api/map.4.0.js"></script>
Для поддержки работы браузера Internet Explorer 11 необходимо добавить следующие строки:
<script type="text/javascript" src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Element.prototype.classList"></script>
Для работы библиотеки в Internet Explorer 11 требуется свойство classList. Подробности https://developer.mozilla.org/en-US/docs/Web/API/Element/classList.
Добавление карты
Создание карты на странице
Основным объектом библиотеки является карта. Чтобы добавить карту на страницу, нужно добавить div-контейнер карты на страницу и использовать метод kuboMap.Map после полной загрузки страницы:
map = new kuboMap.Map(<map>, <options>, <config>, <init view>);
Доступны следующие настройки:
map - элемент страницы для карты (string/HTMLElement);
options - настройки карты (object);
config - настройки ресурса (object);
init view - начальные настройки видимости карты (object).
Например:
<div id="map" style="width: 100%; height: 100%;"></div>
<script type="text/javascript">
var map = null;
window.onload = function() {
map = new kuboMap.Map('map', {}, { id: 'code' }, {});
}
</script>
В качестве первого параметра необходимо указать div-контейнер с картой или его название на Вашей странице. Два следующих параметра обязательны (могут быть пустыми) и задают дополнительные настройки внешнего вида карты и настройки ресурса геопортала. Последний параметр задает стартовую позицию и масштаб карты.
Размеры элемента страницы с картой задаются через стили, например:
#map {
width: 100%;
height: 100%;
border: solid 1px #000;
}
Добавление элементов управления
Для добавления элементов управления и навигации на страницу необходимо определить их в настройках карты, например:
var mapOptions = {
mousePosition: true,
scaleLine: false,
zoomBar: false,
query: true,
measure: false
};
map = new kuboMap.Map('map', mapOptions, mapConfig, {});
Доступны следуюшие настройки карты:
mousePosition: позиция указателя, отображает текущее положение курсора на карте;
scaleLine: масштабная линейка, позволяет оценивать расстояние между объектами, не прибегая к вычислениям;
scale: числовое значение масштаба, позволяет оценивать расстояние между объектами, не прибегая к вычислениям;
zoomBar: масштабирование (кнопки + и -);
query: включает и выключает вывод информации при клике на карте (для добавлении кнопки запрос по области нужно включать эту настройку);
queryType: формат выдачи результата запроса при клике по карте ('object' - в виде объекта, 'all' - в виде объекта и в html формате; по умолчанию в html формате);
measure: включает и выключает возможность измерения расстояния на карте с помощью мыши;
message: включает и выключает вывод информационных сообщений на карте;
fullView: кнопка для перехода на полный вид;
tileselect: включает и выключает меню выбора тайловой подложки;
area: выбор области на карте, позволяет выбрать область с помощью мыши на карте;
lang: локализация интерфейса библиотеки ('ru' - русский (по умолчанию), 'en' - английский);
tools: массив кнопок на карте. Доступные варианты: query, queryclick, querybox, measure, measurebox, areabox, areapolygon;
active: массив активных инструментов из одного элемента. Доступные варианты: query, queryclick, querybox, measure, measurebox, areabox, areapolygon.
Инструменты (для массива tools и active):
query, queryclick: запрос по клику на карте;
querybox: запрос по прямоугольной области на карте;
measure: измерение расстояния с помощью линейки;
measurebox: измерение площади;
areabox: выбор прямоугольной области;
areapolygon: выбор произвольной области.
Загрузка настроек ресурса
Формат ресурса геопортала на странице задается в виде объекта:
var mapConfig = {
id: <id>,
sid: <sid>,
key: <key>
};
map = new kuboMap.Map('map', mapOptions, mapConfig, initView);
Доступны следующие настройки:
id - идентификатор ресурса (string);
sid - идентификатор сессии (string);
key - ключ ресурса (используется вместо sid) (string).
Например:
<div id="map" style="width: 100%; height: 100%;"></div>
<script type="text/javascript">
var map = null;
window.onload = function() {
map = new kuboMap.Map('map', {}, { id: 'code', sid: 'session' }, {});
}
</script>
Установка начальной позиции карты
Формат начального масштаба отображения и позиции карты задается в виде объекта:
var initView = {
x: <pos X>,
y: <pos Y>,
zoom: <zoom>,
tile: <tile>
};
map = new kuboMap.Map('map', mapOptions, mapConfig, initView);
Доступны следуюшие настройки:
x - позиция по оси X (float);
y - позиция по оси Y (float);
zoom - масштаб (integer);
tile - тайловая подложка (string).
Доступные тайловые подложки:
"" - без подложки (по умолчанию),
base - Карта-схема,
topo - Топооснова,
topo_label - Топооснова (подписи),
label - Подписи,
landsat2012 - Спутник (Landsat2012),
landsat2014 - Спутник (Landsat2014),
landsat2016 - Спутник (Landsat2016),
sentinel2016 - Спутник (Sentinel),
relief_light - Рельеф (светлая),
relief_dark - Рельеф (темная),
bpd_light - БПД (светлая),
bpd_dark - БПД (темная),
osm - OSM Mapnik,
osm_opentopo - OpenTopoMap,
osm_sputnik - Спутник,
yandex_street - Yandex (обычная),
yandex_hybrid - Yandex (гибрид),
yandex_satellite - Yandex (спутник),
google_street - Google (обычная),
google_hybrid - Google (гибрид),
google_satellite - Google (спутник),
google_physics - Google (физическая),
arcgis_worldtopo - ESRI Топографическая,
arcgis_worldstreet - ESRI Улицы,
arcgis_worldterrain - ESRI Ландшафт,
arcgis_worldrelief - ESRI Рельеф,
arcgis_worldimagery - ESRI Изображение.
Подложки yandex_* и google_* работают с ограничениями и использовать не рекомендуется.
Пример:
var initView = {
x: 16495486,
y: 6209437,
zoom: 10
};
map = new kuboMap.Map('map', mapOptions, mapConfig, initView);
Готовность API карты
Т.к. загрузка настроек карты выполняется после загрузки страницы, необходимо использовать функцию ready для работы с картой и инициализацией новых объектов на карте.
Функция ready исполняет включенный в нее код после того, как будет загружены все настройки заданной карты.
Ниже представлен пример вызова функции ready:
map = new kuboMap.Map('map', mapOptions, mapConfig, initView);
map.ready( function() {
alert('Карта загружена!');
});
Элементы управления
Добавление легенды
<legend object> = <map object>.initLegend(<html element>, <parameters>);
<map object> - карта (object);
<html element> - элемент страницы для легенды (HTMLElement Object);
<parameters> - дополнительные параметры (object).
Пример:
map.initLegend("legend", { top: "4px", left: "4px", groupclass: true });
Добавление объекта поиска по строке
Для поиска по строке адреса или строке координат можно получить объект, инициализировав поиск:
<search object> = <map object>.initSearch();
<map object> - карта (object);
Объект поиска <search object> имеет метод search(<string>) с параметром в виде строки поиска. Вызов этого метода запускает поиск по строке.
Пример:
var search = map.initSearch();
Добавление объекта для выбора области начального и полного вида
Для выбора области начального и полного вида можно получить объект:
<extentbox object> = <map object>.initExtentBox(<html element>, <init array>, <full array>);
<map object> - карта (object);
<html element> - элемент страницы для активного блока (HTMLElement Object);
<init array> - экстенты начального вида (Array<float, float, float, float>);
<full array> - экстенты полного вида (Array<float, float, float, float>).
Объект выбора области <extentbox object> имеет следующие методы:
activate() - активация объекта;
deactivate() - деактивация объекта;
getExtent() - получение экстентов начального и полного вида (Array<Array<float, float, float, float>, Array<float, float, float, float>>);
setExtent(<init array>, <full array>) - установка экстентов начального и полного вида (Array<float, float, float, float>, Array<float, float, float, float>).
Пример:
var extent = map.initExtentBox(document.getElementById('extent'), [16476795, 6198328, 16507982, 6221749], [16472877, 6192354, 16513594, 6229293]);
Установка настроек объекта для выбора области
Для установки настроек выбора области на карте можно иницилизировать объект:
<map object>.initArea(<type>, <area array>);
<map object> - карта (object);
<type> - тип выбора области (polygon - полигон, box - прямоугольник) (string);
<area array> - WKT строка с полигоном (<string>) или массив точек полигона ((x0,y0),(x1,y1),...) (Array<point>, где <point> - массив координат [x, y])) (необязательный параметр);
Пример:
map.initArea('box');
Маркеры на карте
Добавление маркера на карту
<marker object> = <map object>.addMarker(<x>, <y>, <options>);
<marker object> - объект с маркером;
<map object> - карта (object);
<x>, <y> - координаты объекта в проеции карты;
<options> - настройки маркера.
Доступные настройки маркера:
img: url изображения маркера;
anchor: центр изображения маркера, по умолчанию [0.5, 0.5];
offset: сдвиг изображения маркера относительно его центра в пикселях, по умолчанию [0, 0];
attributes: атрибуты объекта.
Пример:
var marker = map.addMarker(16495486, 6209437, {
img: 'images/icon.png',
anchor: [0.5, 1],
attributes: { 'id': 49 }
});
Удаление маркера с карты
<map object>.removeMarker(<marker object>);
<map object> - карта (object);
<marker object> - объект с маркером.
Пример:
map.removeMarker(marker);
Удаление всех маркеров с карты
<map object>.clearMarkers();
<map object> - карта (object).
Пример:
map.clearMarkers();
Добавление обработчика выбора для маркеров
<map object>.setMarkersAction(<function select>);
<map object> - карта (object);
<function select> - обработчик события при клике на маркере (function({position, attr})).
Пример:
map.setMarkersAction(function(obj) {
map.addPopup(obj.position[0], obj.position[1], 'ID: ' + obj.attr.id);
});
События
Добавление обработчика событий для клика по карте
<map object>.setQueryAction(<function select>);
<map object> - карта (object);
<function select> - обработчик события при клике на карте (function({html, query, position})).
В качестве параметра для обработчиков событий передается объект со следующими свойствами:
html - результат запроса в html формате (если queryType не задан или установлен в 'all');
query - результат запроса в виде массива формата [attributes (набор полей), data (набор данных)] (если queryType установлен в 'object' или 'all');
position - координаты объекта [x,y].
Пример:
map.setQueryAction(function(obj) {
var text = '<b>Информация</b><br>'+obj.query[0].data[0][0];
map.addPopup(obj.position[0], obj.position[1], text);
});
или
map.setQueryAction(function(obj) {
map.addPopup(obj.position[0], obj.position[1], obj.html);
});
Добавление обработчика событий для поиска по строке
<map object>.setSearchAction(<function select>);
<map object> - карта (object);
<function select> - обработчик события при поиске по строке (function({type, result})).
В качестве параметра для обработчиков событий передается объект со следующими свойствами:
type - 1 - поиск по координате, 2 - поиск по строке;
result - результат запроса в виде массива:
для type = 1 массив, преобразованых в проекцию карты координат в формате [x ,y],
для type = 2 массив результатов поиска в формате Array<search result>.
Где <search result> объект {text, wkt, description} (text - строка с результатом поиска, description - описание, wkt - массив координат в формате [x, y])
Пример:
map.setSearchAction(function(obj) {
if (json.type == 1) map.mapTo(obj.result[0], obj.result[1]);
if ((json.type == 2) && (json.result.length > 0)) console.log(obj.result[0].wkt[0], obj.result[0].wkt[1]);
});
Добавление обработчика событий для выбора области
<map object>.setAreaAction(<function select>);
<map object> - карта (object);
<function select> - обработчик события при выборе области (function({proj, points})).
В качестве параметра для обработчиков событий передается объект со следующими свойствами:
proj - код проекции;
points - массив координат области в формате [[x0, y0], [x1, y1], [x2, y2], ...].
Пример:
map.setAreaAction(function(obj) {
console.log(obj.points);
});
Добавления обработчика событий при обновлении карты после смены подложки
<map object>.setRebuildMapAction(<function select>);
<map object> - карта (object);
<function select> - обработчик события при обновлении карты после смены подложки (function({})).
Пример:
map.setRebuildMapAction(function(obj) {
console.log('reload');
});
Получение объекта для выдачи сообщений на карте
<message object> = <map object>.getMessageObject();
<message object> - объект для вывода сообщений (object);
<map object> - карта (object).
Пример:
var message = map.getMessageObject();
Операции
Переход к точке
<map object>.mapTo(<pos x>, <pos y>, <zoom>);
<map object> - карта (object);
<pos x> - координата X (float);
<pos y> - координата Y (float);
<zoom> - масштабный уровень, необязательный параметр (integer).
Пример:
map.mapTo(16495486, 6209437, 10);
Переход к области
<map object>.mapToBox(<left>, <bottom>, <right>, <top>);
<map object> - карта (object);
<left> - координата левого края (float);
<bottom> - координата нижнего края (float);
<right> - координата правого края (float);
<top> - координата верхнего края (float).
Пример:
map.mapToBox(16496255, 6206643, 16500100, 6210008);
Преобразование координат точки из геодезической системы к системе проекта
<coords> = <map object>.getPointFromWGS(<x>, <y>);
<coords> - координаты точки в системе проекта [x, y] (array);
<map object> - карта (object);
<x> - координата X (float);
<y> - координата Y (float).
Пример:
var xy = map.getPointFromWGS(92, 56);