В этом примере показано, как структурировать данные географических точек, линий и векторов многоугольников и экспортировать их в файл KML. KML - язык разметки на основе XML, предназначенный для визуализации географических данных на веб-картах или «браузерах Земли», таких как Google Earth™, Google Maps™, NASA WorldWind и ESRI ® ArcGIS™ Explorer.
Следующие функции записывают географические данные в файл KML:
kmlwritepoint Запись географических точек в файл KML
kmlwriteline Запись географической строки в файл KML
kmlritepolygon Запись географического полигона в файл KML
kmlwrite Запись географических данных в файл 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
В этом примере записывается одна точка в файл 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;В этом примере записывается одна точка в файл 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;В этом примере в 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;В этом примере в 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;В этом примере записывается одна точка с помощью виртуальной камеры 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;В этом примере записывается одна точка с видом камеры Монумента Вашингтона в Вашингтоне 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;В этом примере неструктурированные адресные данные записываются в файл 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;В этом примере записывается одна строка, соединяющая вершину горы Вашингтон с отелем Маунт Вашингтон в Кэрролле, штат Нью-Гэмпшир, в файл 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;В этом примере журнал дорожек 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;В этом примере круги записываются в виде линий вокруг аэропорта Лондон-Сити в файл 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;В этом примере в файл 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;В этом примере записываются данные полигона из 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;В этом примере выполняется создание контуров сетки в локальной системе координат, возврат контуров в географической системе и запись контуров многоугольника в файл 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;В этом примере создается многоугольник с внутренним кольцом вокруг Эйфелевой башни, и многоугольник записывается в файл 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.
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.