В этом примере показано, как обработать данные о лидаре антенны, полученные от бортовой системы лидара в файл GeoTIFF. Импортируйте файл LAZ, содержащий воздушные данные о лидаре, создайте цифровую поверхностную модель (DSM), на которую пространственно ссылаются, из данных, обрежьте DSM к сфере интересов и экспортируйте обрезанный DSM в файл GeoTIFF.
Когда вы экспортируете DSM в файл GeoTIFF, вы также экспортируете спроектированную систему координат (CRS) для данных. Спроектированные CRSs сопоставляют x-и y-координаты к местоположениям на Земле. Определение спроектированного CRS важно при создании модели, потому что те же координаты в различном предположили, что CRSs может относиться к другим местам.
Считайте 3-D данные об облаке точек для области под Таскалусой, Алабама из файла [1] LAZ. Область включает дороги, деревья и создания.
lazFileName = fullfile(toolboxdir("lidar"),"lidardata","las","aerialLidarData.laz"); lasReader = lasFileReader(lazFileName); ptCloud = readPointCloud(lasReader);
Отобразите данные.
figure pcshow(ptCloud.Location)
DSM включает вертикальные изменения наземных точек, вертикальные изменения природных объектов, такие как деревья и вертикальные изменения искусственных функций, такие как создания. Создайте DSM из данных об облаке точек при помощи pc2dem
функция. Используйте максимальную точку от каждого элемента облака точек, которое соответствует первому импульсу возврата данных о лидаре путем определения CornerFillMethod
как "max"
. Функция возвращает массив значений вертикального изменения и x-и y-пределов данных.
gridRes = 1;
[Z,xlimits,ylimits] = pc2dem(ptCloud,gridRes,CornerFillMethod="max");
pc2dem
функция возвращает значения типа single
, но много функций требуют, чтобы входные параметры имели тип double
. Преобразуйте значения в double
.
Z = double(Z); xlimits = double(xlimits); ylimits = double(ylimits);
Пространственно сошлитесь на DSM путем создания объекта ссылки карты.
R = maprefpostings(xlimits,ylimits,size(Z))
R = MapPostingsReference with properties: XWorldLimits: [429745.03125 430146.03125] YWorldLimits: [3679830.75 3680114.75] RasterSize: [285 402] RasterInterpretation: 'postings' ColumnsStartFrom: 'south' RowsStartFrom: 'west' SampleSpacingInWorldX: 1 SampleSpacingInWorldY: 1 RasterExtentInWorldX: 401 RasterExtentInWorldY: 284 XIntrinsicLimits: [1 402] YIntrinsicLimits: [1 285] TransformationType: 'rectilinear' CoordinateSystemType: 'planar' ProjectedCRS: []
Ссылочный объект содержит информацию, такую как пределы, расстояние между точками и направления столбцов и строк. По умолчанию ссылочный объект принимает, что столбцы запускаются с юга, и строки запускаются с запада. Эти значения по умолчанию сопоставимы с выходом pc2dem
функция, которая создает вертикальное изменение, выстраивает таким образом, что первый элемент представляет точку southwesternmost.
ProjectedCRS
свойство ссылочного объекта пусто, что означает, что DSM не сопоставлен со спроектированным CRS. Метаданные для файла [1] LAZ указывают, что спроектированный CRS является Зоной UTM 16 Н, заданных кодом полномочий EPSG 26916
. Создайте спроектированный объект CRS.
epsgCode = 26916; p = projcrs(epsgCode)
p = projcrs with properties: Name: "NAD83 / UTM zone 16N" GeographicCRS: [1×1 geocrs] ProjectionMethod: "Transverse Mercator" LengthUnit: "meter" ProjectionParameters: [1×1 map.crs.ProjectionParameters]
Обновите ProjectedCRS
свойство ссылочного объекта.
R.ProjectedCRS = p;
Спроектированный CRS состоит из географического CRS и нескольких параметров, которые используются, чтобы преобразовать координаты к и от географического CRS. Географический CRS состоит из данной величины (включая опорный эллипсоид), нулевой меридиан и угловая единица измерения. Просмотрите географический CRS и его опорный эллипсоид.
g = p.GeographicCRS
g = geocrs with properties: Name: "NAD83" Datum: "North American Datum 1983" Spheroid: [1×1 referenceEllipsoid] PrimeMeridian: 0 AngleUnit: "degree"
g.Spheroid
ans = referenceEllipsoid with defining properties: Code: 7019 Name: 'GRS 1980' LengthUnit: 'meter' SemimajorAxis: 6378137 SemiminorAxis: 6356752.31414036 InverseFlattening: 298.257222101 Eccentricity: 0.0818191910428158 and additional properties: Flattening ThirdFlattening MeanRadius SurfaceArea Volume
Отобразите DSM, на который пространственно ссылаются, как служебную поверхность при помощи mapshow
функция.
figure mapshow(Z,R,DisplayType="surface") axis image title("Digital Surface Model (DSM) from Aerial Lidar Data")
Преобразуйте спроектированный x-и y-предельные координаты в географические предельные координаты широты и долготы.
[latlim,lonlim] = projinv(p,xlimits,ylimits);
Просмотрите область с помощью спутниковых снимков. Можно визуально подтвердить, что спутниковые снимки выравниваются с визуализацией DSM, созданной с помощью mapshow
функция.
bboxlat = latlim([1 1 2 2 1]); bboxlon = lonlim([1 2 2 1 1]); geoplot(bboxlat,bboxlon,"r", ... LineWidth=2, ... DisplayName="Aerial Lidar Data Region") hold on geobasemap satellite legend
Географический CRS, лежащий в основе satellite
основная карта является WGS84, в то время как географический CRS, лежащий в основе данных DSM, является NAD83. NAD83 и WGS84 подобны, но не идентичны. В результате могут быть несоответствия между спутниковыми снимками и визуализацией DSM.
Выберите и отобразите необходимую область. Чтобы использовать предопределенную область, которая ограничена дорогами на востоке, север и запад, задают interactivelySelectPoints
как false
. В качестве альтернативы можно в интерактивном режиме выбрать четыре точки, которые задают область путем определения interactivelySelectPoints
как true
.
interactivelySelectPoints = false; if interactivelySelectPoints [cropbboxlat,cropbboxlon] = ginput(4); %#ok<UNRCH> else cropbboxlat = [33.2571550; 33.2551982; 33.2551982; 33.2571125]; cropbboxlon = [-87.7530648; -87.7530139; -87.7509086; -87.7509086]; end geoplot(cropbboxlat([1:4 1]),cropbboxlon([1:4 1]),"y", ... LineWidth=2, ... DisplayName="Selected Region of Interest")
Преобразуйте предельные координаты широты и долготы для области к y-предельные координаты и x-.
[cropbboxx,cropbboxy] = projfwd(p,cropbboxlat(:),cropbboxlon(:));
Создайте пределы обрезки путем нахождения границ x-и y-координат.
[cropxlimmin,cropxlimmax] = bounds(cropbboxx); cropxlimits = [cropxlimmin cropxlimmax]; [cropylimmin,cropylimmax] = bounds(cropbboxy); cropylimits = [cropylimmin cropylimmax];
Создайте новое, пространственно сослался на DSM, который содержит данные в необходимой области.
[Zcrop,Rcrop] = mapcrop(Z,R,cropxlimits,cropylimits);
Запишите обрезанный DSM в файл GeoTIFF под названием lidardsm.tif
. Задайте спроектированный CRS при помощи CoordRefSysCode
аргумент.
datafile = "lidardsm.tif";
geotiffwrite(datafile,Zcrop,Rcrop,CoordRefSysCode=epsgCode)
Один способ подтвердить файл GeoTIFF состоит в том, чтобы возвратить информацию о файле как RasterInfo
объект. Например, проверьте, что спроектированный CRS находится в файле путем запроса CoordinateReferenceSystem
свойство RasterInfo
объект.
info = georasterinfo(datafile); info.CoordinateReferenceSystem
ans = projcrs with properties: Name: "NAD83 / UTM zone 16N" GeographicCRS: [1×1 geocrs] ProjectionMethod: "Transverse Mercator" LengthUnit: "meter" ProjectionParameters: [1×1 map.crs.ProjectionParameters]
Другой способ подтвердить файл GeoTIFF путем отображения его. Считайте новый DSM как массив и ссылочный объект при помощи readgeoraster
функция. Затем отобразите DSM.
[Z2,R2] = readgeoraster(datafile); figure mapshow(Z2,R2,DisplayType="surface") axis image title("Cropped DSM from Aerial Lidar Data")
Можно использовать файл GeoTIFF в других приложениях, которые импортируют данные о GIS. Например, RoadRunner позволяет вам добавить данные о вертикальном изменении от файлов GeoTIFF до сцен.
[1] OpenTopography. “Таскалуса, AL: Сезонная Динамика Наплыва И Бесхарактерные Сообщества”, 2011. https://doi.org/10.5069/G9SF2T3K.
geotiffwrite
| mapshow
| pc2dem
(Lidar Toolbox) | segmentGroundSMRF
(Lidar Toolbox)MapPostingsReference
| projcrs
| lasFileReader
(Lidar Toolbox)