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

Этот пример показывает, как структурировать географическую точку, строку и данные о векторе полигона и экспортировать его в файл Языка разметки замочной скважины (KML). KML является основанным на XML языком разметки, разработанным для визуализации географических данных по Веб-картам или "Наземным браузерам", таким как Google Earth™, Google Maps™, НАСА WorldWind и Проводник ESRI® ArcGIS™.

Следующие функции пишут географические данные в файл 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.

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

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. placemark включает значок и описание с разметкой HTML.

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

lat = 42.299827;
lon = -71.350273;

Создайте описание для placemark. Включайте 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');

Присвойте имя для placemark.

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. Присвойте имя placemark к имени города. Удалите описание по умолчанию, поскольку данные имеют только один атрибут.

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

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

openKML(filename)

Добавьте filename в kmlFilenames.

kmlFilenames{end+1} = filename;

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

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

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

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

Преобразуйте в вектор геоточки.

tsunamis = geopoint(tsunamis);

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

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

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

attribspec = makeattribspec(tsunamis);

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

  • Отобразите Max_Height, Причину, год, Местоположение и атрибуты Страны

  • Переименуйте поле 'Max_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 для каждого из placemarks.

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 Hotel в Кэрролле, Нью-Гэмпшир, к файлу 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 Hotel.

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;

Вычислите маленькие круги 3 000, 2000, и 1 000-метровый радиус. Присвойте значение цвета '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 вектора геоформы к '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: Запишите Данные о Полигоне от Файла форм до файла KML

Этот пример пишет данные о полигоне от файла форм usastatelo до файла 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

Data from the Digital Chart of the World (DCW) browser layer,

published by U.S. National Geospatial-Intelligence Agency (NGA),

formerly National Imagery and Mapping Agency (NIMA).

tsunamis.shp

Data from Global Tsunami Database, U.S. National Geospatial Data

Center (NGDC), National Oceanic and Atmospheric Administration (NOAA)

usastatelo.shp

Based on data from the CIA World DataBank II and the U.S. Census

Bureau site "State and County QuickFacts".

Смотрите также

| | |