exponenta event banner

Экспорт векторных данных в KML

В этом примере показано, как структурировать данные географических точек, линий и векторов многоугольников и экспортировать их в файл KML. KML - язык разметки на основе XML, предназначенный для визуализации географических данных на веб-картах или «браузерах Земли», таких как Google Earth™, Google Maps™, NASA WorldWind и ESRI ® ArcGIS™ Explorer.

Следующие функции записывают географические данные в файл KML:

  • kmlwritepoint Запись географических точек в файл KML

  • kmlwriteline Запись географической строки в файл KML

  • kmlritepolygon Запись географического полигона в файл KML

  • kmlwrite Запись географических данных в файл KML

Определение папки вывода для файлов KML

В этом примере создается несколько файлов KML и используется переменная kmlFolder для обозначения их местоположения. Используемое здесь значение определяется выводом tempdir команда, но вы можете легко настроить это.

kmlFolder = tempdir;

Создайте массив ячеек имен KML-файлов, используемых в этом примере, чтобы при необходимости удалить их из папки вывода KML по завершении примера.

kmlFilenames = {};

Создание дескриптора функции для открытия браузера Земли

Файл KML можно открыть в различных браузерах Earth, веб-картах или редакторе. Для открытия KML-файла можно настроить следующий дескриптор анонимной функции. При выполнении этой функции запускается браузер Google Earth, который должен быть установлен на компьютере. Приложение можно использовать путем присвоения переменной. useApplication кому true в рабочей области или назначить его true здесь.

useApplication = exist('useApplication','var') && useApplication;
if useApplication
    if ispc
        % On Windows(R) platforms display the KML file with:
        openKML = @(filename) winopen(filename);
    elseif ismac
        % On Mac platforms display the KML file with:
        cmd = 'open -a Google\ Earth ';
        openKML = @(filename) system([cmd filename]);
    else
        % On Linux platforms display the KML file with:
        cmd = 'googleearth ';
        openKML = @(filename) system([cmd filename]);
    end
else
    % No "Earth browser" is installed on the system.
    openKML = @(filename) disp('');
end

Пример 1: Запись одной точки в файл KML

В этом примере записывается одна точка в файл KML.

Задайте значения широты и долготы для Падерборна, Германия.

lat = 51.715254;
lon = 8.75213;

Использовать kmlwritepoint для записи точки в файл KML.

filename = fullfile(kmlFolder,'Paderborn.kml');
kmlwritepoint(filename,lat,lon);

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 2: Запись одной точки в файл KML со значком и описанием

В этом примере записывается одна точка в файл KML. Информационный знак содержит значок и описание с разметкой HTML.

Задайте координаты широты и долготы для точки, в которой расположена штаб-квартира MathWorks ® в Натике, штат Массачусетс.

lat = 42.299827;
lon = -71.350273;

Создайте описание для метки размещения. Включите теги HTML в описание, чтобы добавить новые строки для адреса.

description = sprintf('%s<br>%s</br><br>%s</br>', ...
   '3 Apple Hill Drive', 'Natick, MA. 01760', ...
   'https://www.mathworks.com');

Назначить iconFilename в GIF-файл в сети локальной системы.

iconDir = fullfile(matlabroot,'toolbox','matlab','icons');
iconFilename = fullfile(iconDir,'matlabicon.gif');

Назначьте имя для метки.

name = 'The MathWorks, Inc.';

Использовать kmlwritepoint для записи точки и связанных данных в файл KML.

filename = fullfile(kmlFolder,'MathWorks.kml');
kmlwritepoint(filename,lat,lon,'Description',description,'Name',name, ...
   'Icon',iconFilename);

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 3: Запись нескольких точек в KML-файл

В этом примере в KML-файл записываются местоположения крупных европейских городов, включая имена городов, и удаляется таблица описания по умолчанию.

Назначьте ограничительную рамку широты и долготы.

latlim = [ 30; 75];
lonlim = [-25; 45];

Считывание данных из worldcities формофайл в массив геоструктов.

cities = shaperead('worldcities.shp','UseGeoCoords',true, ...
    'BoundingBox',[lonlim, latlim]);

Преобразование в вектор географической точки.

cities = geopoint(cities);

Использовать kmlwrite для записи вектора географической точки в файл KML. Присвойте название информационной метки названию города. Удалите описание по умолчанию, поскольку данные имеют только один атрибут.

filename = fullfile(kmlFolder,'European_Cities.kml');
kmlwrite(filename,cities,'Name',cities.Name,'Description',{});

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 4: Запись нескольких точек в файл KML с измененной таблицей атрибутов

В этом примере в KML-файл записываются метки-заполнители в местах возникновения цунами (приливной волны), о которых сообщается в течение нескольких десятилетий и которые маркируются географически по местоположению источника.

Считывайте данные из файла формы цунами.

tsunamis = shaperead('tsunamis','UseGeoCoords',true);

Преобразование в вектор географической точки.

tsunamis = geopoint(tsunamis);

Сортировка атрибутов.

tsunamis = tsunamis(:, sort(fieldnames(tsunamis)));

Создайте спецификацию атрибута.

attribspec = makeattribspec(tsunamis);

Измените спецификацию атрибута следующим образом:

  • Показ Max_Height, Cause, Year, Location, и Country признаки

  • Переименование Max_Height поле в Maximum Height

  • Выделить каждую метку атрибута жирным шрифтом

  • Установите нулевое число десятичных разрядов, используемых для отображения года

  • Мы знаем, что единицы измерения высоты - метры, поэтому добавим это в спецификатор формата Height

desiredAttributes = {'Max_Height','Cause','Year','Location','Country'};
allAttributes = fieldnames(attribspec);
attributes = setdiff(allAttributes, desiredAttributes);
attribspec = rmfield(attribspec, attributes);
attribspec.Max_Height.AttributeLabel = '<b>Maximum Height</b>';
attribspec.Max_Height.Format = '%.1f Meters';
attribspec.Cause.AttributeLabel = '<b>Cause</b>';
attribspec.Year.AttributeLabel = '<b>Year</b>';
attribspec.Year.Format = '%.0f';
attribspec.Location.AttributeLabel = '<b>Location</b>';
attribspec.Country.AttributeLabel = '<b>Country</b>';

Использовать kmlwrite для записи вектора географической точки, содержащего выбранные атрибуты и исходные местоположения, в KML-файл.

filename = fullfile(kmlFolder, 'Tsunami_Events.kml');
name = tsunamis.Location;
kmlwrite(filename,tsunamis,'Description',attribspec,'Name',name)

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 5: Запись одной точки с помощью виртуальной камеры LookAt в файл KML

В этом примере записывается одна точка с помощью виртуальной камеры LookAt рядом с Мачу-Пикчу, Перу

Используйте вектор географической точки для определения виртуальной камеры LookAt.

lat = -13.163111;
lon = -72.544945;
lookAt = geopoint(lat,lon);
lookAt.Range = 1500;
lookAt.Heading = 260;
lookAt.Tilt = 67;

Использовать kmlwritepoint для записи местоположения точки и информации LookAt.

filename = fullfile(kmlFolder, 'Machu_Picchu.kml');
alt = 2430;
name = 'Machu Picchu';
kmlwritepoint(filename,lat,lon,alt,'LookAt',lookAt,'Name',name);

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 6: Запись одной точки с камерой в файл KML

В этом примере записывается одна точка с видом камеры Монумента Вашингтона в Вашингтоне D.C в файл KML. Маркер размещается в месте расположения камеры на земле.

Создайте камеру.

camlat = 38.889301;
camlon = -77.039731;
camera = geopoint(camlat,camlon);
camera.Altitude = 500;
camera.Heading = 90;
camera.Tilt = 45;
camera.Roll = 0;

Использовать kmlwritepoint для записи местоположения точки и информации о камере.

name = 'Camera ground location';
lat = camera.Latitude;
lon = camera.Longitude;
filename = fullfile(kmlFolder,'WashingtonMonument.kml');
kmlwritepoint(filename,lat,lon,'Camera',camera,'Name',name)

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 7: Запись адресных данных в файл KML

В этом примере неструктурированные адресные данные записываются в файл KML.

Создайте массив ячеек, содержащий имена нескольких интересующих мест в районе Бостона.

names = {'Boston', ...
    'Massachusetts Institute of Technology', ...
    'Harvard University', ...
    'Fenway Park', ...
    'North End'};

Создайте массив ячеек, содержащий адреса для интересующих мест в районе Бостона.

addresses = { ...
    'Boston, MA', ...
    '77 Massachusetts Ave, Cambridge, MA 02139', ...
    'Massachusetts Hall, Cambridge MA 02138', ...
    '4 Yawkey Way, Boston, MA', ...
    '134 Salem St, Boston, MA'};

Используйте значок Google Maps для каждой метки.

icon = 'http://maps.google.com/mapfiles/kml/paddle/red-circle.png';

Использовать kmlwrite для записи массива ячеек адресов в файл KML.

filename = fullfile(kmlFolder, 'Places_of_Interest.kml');
kmlwrite(filename,addresses,'Name',names,'Icon',icon,'IconScale',1.5);

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 8: Запись одной строки в файл KML

В этом примере записывается одна строка, соединяющая вершину горы Вашингтон с отелем Маунт Вашингтон в Кэрролле, штат Нью-Гэмпшир, в файл KML.

Назначьте значения координат для интересующей области.

lat_Mount_Washington = 44.270489039;
lon_Mount_Washington = -71.303246453;

lat_Mount_Washington_Hotel = 44.258056;
lon_Mount_Washington_Hotel = -71.440278;

lat = [lat_Mount_Washington lat_Mount_Washington_Hotel];
lon = [lon_Mount_Washington lon_Mount_Washington_Hotel];

Установите высоту 6 футов для приблизительного роста человека.

alt = 6 * unitsratio('meters', 'feet');

Добавьте точку обзора камеры из отеля Mount Washington.

clat = lat(2);
clon = lon(2);
camera = geopoint(clat,clon,'Altitude',2,'Tilt',90,'Roll',0,'Heading',90);

Использовать kmlwriteline для записи массивов в файл KML.

filename = fullfile(kmlFolder, 'Mount_Washington.kml');
name = 'Mount Washington';
kmlwriteline(filename,lat,lon,alt,'Name',name,'Color','k','Width',3, ...
    'Camera',camera,'AltitudeMode','relativeToGround');

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 9: Запись журнала дорожек GPS в файл KML

В этом примере журнал дорожек GPS записывается в файл KML.

Прочитайте журнал дорожек из файла GPX. Данные в журнале трека были получены с наручных часов GPS, удерживаемых при скольжении над Маунт-Мэнсфилд в Вермонте, США, 28 августа 2010 года.

track = gpxread('sample_mixed','FeatureType','track');

Использовать kmlwriteline для записи журнала дорожек в файл KML. Значения высоты, полученные с помощью GPS, относятся к уровню моря.

filename = fullfile(kmlFolder, 'GPS_Track_Log.kml');
lat = track.Latitude;
lon = track.Longitude;
alt = track.Elevation;
name = 'GPS Track Log';
kmlwriteline(filename,lat,lon,alt,'Name',name,'Color','k','Width',2, ...
    'AltitudeMode','relativeToSeaLevel');

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 10: Запись кругов в файл KML

В этом примере круги записываются в виде линий вокруг аэропорта Лондон-Сити в файл KML. Пример включает в себя LookAt виртуальная камера.

Назначьте значения широты и долготы для центра элемента.

lat0 = 51.50487;
lon0 = .05235;

Назначить azimuth [] для вычисления полного малого круга. Используйте эллипсоид WGS84.

azimuth = [];
spheroid = wgs84Ellipsoid;

Вычислите малые круги с радиусом 3000, 2000 и 1000 метров. Назначение значения цвета 'blue', 'green', и 'red' для каждого круга. Задайте значение отметки 100 метров (над землей) для каждого круга. Для хранения данных используйте вектор геошейпа линии.

radius = 3000:-1000:1000;
colors = {'blue','green','red'};
elevation = 100;
circles = geoshape(0,0,'Name','','Color','','Elevation',elevation);
for k = 1:length(radius)
    [lat, lon] = scircle1(lat0,lon0,radius(k),azimuth,spheroid);
    circles(k).Latitude = lat;
    circles(k).Longitude = lon;
    circles(k).Name = [num2str(radius(k)) ' Meters'];
    circles(k).Color = colors{k};
    circles(k).Elevation = elevation;
end

Используйте вектор географической точки для определения виртуальной камеры LookAt с точкой обзора с востока аэропорта и выровненной по взлетно-посадочной полосе.

lat = 51.503169;
lon =  0.105478;
range = 3500;
heading = 270;
tilt =  60;
lookAt = geopoint(lat,lon,'Range',range,'Heading',heading,'Tilt',tilt);

Использовать kmlwrite для записи вектора геошейпа, содержащего круги и связанные данные, в файл KML.

filename = fullfile(kmlFolder,'Small_Circles.kml');
kmlwrite(filename,circles,'AltitudeMode','relativeToGround','Width',2, ...
    'Name',circles.Name,'Color',circles.Color,'LookAt',lookAt);

Откройте файл KML. Используя Google Earth, LookAt точка обзора устанавливается при щелчке по одной из кнопок 1000 Meters, 2000 Meters, или 3000 Meters строки в списке «Места».

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 11: Запись круговых полигонов в файл KML

В этом примере в файл KML записываются круговые полигоны вокруг аэропорта Лондон-Сити. Он включает в себя LookAt виртуальная камера и использует те же данные, рассчитанные на этапе 9.

Изменить Geometry значение свойства вектора geoshape для 'polygon'. Многоугольники рисуются в том же порядке, что и вектор геошейпа, и индексируются от наибольшего до наименьшего радиусов, таким образом каждый многоугольник будет виден в браузере.

circles.Geometry = 'polygon';

Измените отметку каждого многоугольника.

circles.Elevation = 1000:1000:3000;

Используйте вектор географической точки для определения виртуальной камеры LookAt с точкой обзора с востока аэропорта, выровненной по взлетно-посадочной полосе, и с видом всех трех многоугольников.

lat = 51.501587;
lon = 0.066147;
range = 13110;
heading = 270;
tilt = 60;
lookAt = geopoint(lat,lon,'Range',range,'Heading',heading,'Tilt',tilt);

Использовать kmlwrite для записи вектора геошейп многоугольника, содержащего круговые многоугольники и связанные данные, в файл KML. Выдавливание полигонов на землю. Установите черный цвет кромки многоугольника и назначьте значение альфа-грани для обеспечения видимости внутри многоугольника.

filename = fullfile(kmlFolder,'Small_Circle_Polygons.kml');
name = circles.Name;
color = circles.Color;
kmlwrite(filename,circles,'AltitudeMode','relativeToGround','Extrude',true, ...
    'Name',name,'FaceColor',color,'EdgeColor','k','FaceAlpha',.6,'LookAt',lookAt);

Откройте файл KML. Используя Google Earth, LookAt точка обзора устанавливается при щелчке по одной из кнопок 1000 Meters, 2000 Meters, или 3000 Meters строки в списке «Места».

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 12: Запись данных полигона из файла Shapefile в файл KML

В этом примере записываются данные полигона из usastatelo shapefile в файл KML. Грани многоугольника задаются цветом, соответствующим политическим регионам. Грани многоугольника задаются со значением альфа для обеспечения видимости внутри многоугольника.

states = shaperead('usastatelo','UseGeoCoords',true);
states = geoshape(states);
colors = polcmap(length(states));
name = states.Name;
filename = fullfile(kmlFolder,'usastatelo.kml');
kmlwrite(filename,states,'Name',name,'FaceColor',colors,'FaceAlpha',.6, ...
    'EdgeColor','k')

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 13: Запись контуров полигона в файл KML

В этом примере выполняется создание контуров сетки в локальной системе координат, возврат контуров в географической системе и запись контуров многоугольника в файл KML.

Создайте сетку в локальной системе.

X = -150000:10000:150000;
Y =  0:10000:300000;
[xmesh, ymesh] = meshgrid(X/50000, (Y - 150000)/50000);
Z = 8 + peaks(xmesh, ymesh);

Определите локальное геодезическое начало вблизи Франкфурта, Германия, и эллипсоидальную высоту.

lat0 = 50.108;
lon0 = 8.6732;
h0 = 100;

Определите уровни горизонталей.

levels = 0:2:18;

Законтрите сетку и верните выходные данные в векторе геошапы многоугольника.

[~, contourPolygons] = geocontourxy(X,Y,Z,lat0,lon0,h0,'LevelList',levels);

Вывод контуров в файл KML. Задайте для граней значение альфа. Набор CutPolygons кому false так как значения высоты неодинаковы. Прикрепите многоугольники к земле.

colors = parula(length(contourPolygons));
filename = fullfile(kmlFolder,'Contour_Polygons.kml');
kmlwrite(filename,contourPolygons,'FaceColor',colors,'FaceAlpha',.6, ...
    'EdgeColor','k','CutPolygons',false,'AltitudeMode','clampToGround')

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Пример 14: Запись полигона с внутренним кольцом в файл KML

В этом примере создается многоугольник с внутренним кольцом вокруг Эйфелевой башни, и многоугольник записывается в файл KML. Высота многоугольника установлена на высоте 500 метров над уровнем земли.

lat0 = 48.858288;
lon0 = 2.294548;
outerRadius = .02;
innerRadius = .01;
[lat1,lon1] = scircle1(lat0,lon0,outerRadius);
[lat2,lon2] = scircle1(lat0,lon0,innerRadius);
[lon2,lat2] = poly2ccw(lon2,lat2);
lat = [lat1; NaN; lat2];
lon = [lon1; NaN; lon2];
alt = 500;
filename = fullfile(kmlFolder,'EiffelTower.kml');

Экспортируйте полигон в файл KML. Установите черный цвет кромки, голубой цвет грани и альфа-значение грани.

kmlwritepolygon(filename,lat,lon,alt,'EdgeColor','k','FaceColor','c', ...
    'FaceAlpha',.5)

Откройте файл KML.

openKML(filename)

Добавить filename кому kmlFilenames.

kmlFilenames{end+1} = filename;

Удалить созданные файлы KML

При необходимости удалите новые файлы KML из папки вывода KML.

if ~useApplication
    for k = 1:length(kmlFilenames)
        delete(kmlFilenames{k})
    end
end

Сведения о наборе данных

Данные в worldcities.shp взят из слоя браузера Digital Chart of the World (DCW), опубликованного Национальным агентством геопространственной разведки США (NGA), ранее - Национальным агентством изображений и картографирования (NIMA). Для получения дополнительной информации о наборе данных используйте команду type worldcities.txt.

Данные в tsunamis.shp из Глобальной базы данных цунами, Национального центра геопространственных данных США (NGDC), Национального управления океанических и атмосферных исследований (NOAA). Для получения дополнительной информации о наборе данных используйте команду type tsunamis.txt.

Данные в usastatelo.shp основан на данных ЦРУ World DataBank II и сайта Бюро переписи США «State and County QuickFacts». Для получения дополнительной информации о наборе данных используйте команду type usastatelo.txt. Обновленную ссылку на сайт Бюро переписи населения США «State and County QuickFacts» см. в разделе https://www.census.gov/quickfacts/fact/table/US/PST045219.

См. также

| | |