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

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

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

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

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

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

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

Определите папку Выхода для файлов KML

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

kmlFolder = tempdir;

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

kmlFilenames = {};

Создайте указатель на функцию, чтобы открыть браузер Земли

Файл KML можно открыть в различных «земных браузерах», веб-картах или редакторе. Можно настроить следующий указатель анонимной функции, чтобы открыть файл 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.

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

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 shapefile в массив геомассивов структур.

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 shapefile.

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

Этот пример запишет одну точку с полем зрения камеры на памятник Вашингтону в Вашингтоне в файл 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

Этот пример запишет одну линию, соединяющую верхнюю часть горы Вашингтон с отелем Mount Washington в Кэрролле, штат Нью-Гемпшир, в файл 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 метров (над землей) для каждого круга. Используйте вектор линии geoshape, чтобы содержать данные.

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 view point устанавливается при нажатии на любой из 1000 Meters, 2000 Meters, или 3000 Meters строки в списке Places.

openKML(filename)

Добавить filename на kmlFilenames.

kmlFilenames{end+1} = filename;

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

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

Измените Geometry значение свойства вектора геосхемы в '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 view point устанавливается при нажатии на любой из 1000 Meters, 2000 Meters, или 3000 Meters строки в списке Places.

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

См. также

| | |