GeoTrellis — это Scala-библиотека и платформа для обработки растровых данных на основе Apache Spark. 1. Может эффективно читать/записывать и работать с растрами, а также реализовывать операции с картами и инструменты преобразования растров в растры. 2. Растровые данные можно преобразовать в изображения PNG, а метаданные преобразовать в JSON.
1. Создание масштабируемых высокопроизводительных веб-сервисов обработки географической информации. 2. Создать распределенные службы обработки географической информации для обработки огромных наборов данных. 3. Выполните параллельные операции обработки географической информации, чтобы воспользоваться преимуществами многоядерной архитектуры.
GeoTrellis может импортировать данные (Tiff) из локального, HDFS, S3 в локальный, HDFS, Accumulo, HBASE, CASSANDRA, S3 и т. д. Существует много вариантов, и они обрабатываются параллельно через кластер Spark, что эквивалентно реализации GeoTrellis. распределенная резка плитки.
GeoTrellis — это платформа для распределенных пространственных вычислений для больших объемов растровых данных. Поэтому, какая бы операция ни выполнялась, большие блоки данных сначала разрезаются на небольшие данные (тайлы) определенного размера. разделяй и властвуй, что также является сутью распределенных вычислений. Первым шагом GeoTrellis является разделение данных (независимо от того, хранятся ли они в памяти или постоянно сохраняются). Однако, какой бы мощной она ни была, в реальной работе трудно удовлетворить следующие требования: Глобальные (крупномасштабные) данные изображений дистанционного зондирования высокого разрешения с объемом данных на уровне ТБ. Обновление локальных данных Объединение данных в разное время
Возможным решением является выполнение операций обновления или пакетной обработки. Платформа GeoTrellis предоставляет интерфейс ETL для данных, но можно выполнять только операции записи, а операции обновления не могут быть выполнены. Операция записи перезапишет существующие данные на этом уровне. краевые данные не могут быть. В силу этого данные отсутствуют, поэтому их можно записывать в разные слои только пакетами.
Каталог Источник данных TileSetRasterLayer AccumuloAttributeStore / AccumuloValueReader // Чтение данных плитки Accumulo Растровый экстент GeoTiffReader SinglebandGeoTiff // Чтение одного канала MultibandGeoTiff // Чтение нескольких каналов LayerReader // Чтение всего слоя информации о тайле в кластере GeoTiff SpatialKey // Соответствующее значение ключа каждой плитки в Accumulo можно получить через значение ключа. // tileReader.readerSpatialKey, Tile.read(k)
SparkUtils Метаданные слоя плитки HadoopGeoTiffRDD //Чтение класса файла Tiff Перепроектировать: перепроектировать
Импорт одноканальных данных Tiff: неявное значение sc = SparkUtils.createSparkContext("ETL SinglebandIngest", new SparkConf(true)) Etl.ingest[ProjectedExtent, SpatialKey, Tile](args, ZCurveKeyIndexMethod) sc.stop()
Импорт многоканальных данных Tiff: неявное значение sc = SparkUtils.createSparkContext("ETL MultibandIngest", new SparkConf(true)) Etl.ingest[ProjectedExtent, SpatialKey, MultibandTile](args, ZCurveKeyIndexMethod) sc.stop()
GeoTrellis читает файлы Tiff HadoopGeoTiffRDD
Геометрия. Rasterizer.rasterizeWithValue(функции, re, 100) Rasterizer.foreachCellByGeometry(feature.geometry, re)
ссылка: https://www.cnblogs.com/shoufengwei/p/5422844.html
Настройте файл catolog.json в application.conf для записи информации об источнике данных и получения данных с помощью этой информации.
–layoutScheme: tms/floating При плавающем разрезании фрагментов остается только слой 0. Это эквивалентно использованию плавающего типа для обработки исходных данных. Оно разрезает данные только на блоки 256*256, а слой равен 0 (вы этого не делаете). Не нужно беспокоиться о конкретных числах x и y, георешетка будет рассчитана автоматически) tms построит пирамиду. Использование tms вырезает данные из максимального слоя (этот максимальный слой рассчитывается на основе разрешения данных). первый слой при вызове будет вызываться непосредственно в соответствии со слоем.
--pyramid: добавление этого параметра приведет к созданию пирамиды, когда LayoutScheme = tms
-I путь=файл:/…: Если здесь указан путь к файлу, этот файл будет импортирован отдельно. Если это папка, весь путь будет импортирован сразу, и он будет автоматически склеен, и так будет. отсутствие щелей в плитке. Geotrellis может не только резать плитку распределенным образом, но и автоматически склеивать ее.
–layer : Этот параметр используется для различения разных данных. При выборке данных этот параметр используется для различения разных данных. ссылка: https://www.cnblogs.com/shoufengwei/p/5468068.html
LayerReader: Считайте весь слой информации о плитке, а затем получите значение точки на основе смещения.
val r = reader.read[SpatialKey, Tile, TileLayerMetadata[SpatialKey]](layerId)
val mapTransform = r.metadata.mapTransform
val key = r.metadata.mapTransform(point)
val dataValues: Seq[Double] = r.asRasters().lookup(key).map(_.getDoubleValueAtPoint(point))
val value = if(dataValues == null || dataValues.length <= 0) 0 else dataValues.head
ValueReader: сначала найдите соответствующий тайл, затем сместите его, чтобы получить эту точку.
val key = attributeStore.readMetadata[TileLayerMetadata[SpatialKey]](layerId).mapTransform(point)
val (col, row) = attributeStore.readMetadata[TileLayerMetadata[SpatialKey]](layerId).toRasterExtent().mapToGrid(point)
//Читаем тайлы
val tile: Tile = tileReader.reader[SpatialKey, Tile](layerId).read(key)
val tileCol = col - key.col * tile.cols
val tileRow = row - key.row * tile.rows
println(s"tileCol=${tileCol} tileRow = ${tileRow}")
tile.get(tileCol, tileRow)
Многополосное чтение плиток val multiTile = tileReader.reader[SpatialKey, MultibandTile](LayerId(имя, масштаб)).read(ключ)
Получить одну группу из нескольких групп Многополосная плитка multiTile.bands(bandNum)
Непосредственное чтение всего слоя данных readSpatialKey, Tile, TileLayerMetadata[SpatialKey]
Добавьте объект LayerQuery в метод чтения. Reader.read[SpatialKey, Tile, TileLayerMetadata[SpatialKey]](layerId, новый LayerQuery[SpatialKey, TileLayerMetadata[SpatialKey]].where(Intersects(polygon)))
Грамматический суп второго способа reader.querySpatialKey, Tile, TileLayerMetadata[SpatialKey].where(Intersects(polygon)).result
HBase Accumulo
ссылка: https://www.cnblogs.com/shoufengwei/p/5422844.html
IO(Http) ! Http.Bind(сервис, хост, порт) Вам необходимо использовать следующий оператор для автоматического запуска служб на хосте и соответствующем порту. Конкретная информация о маршрутизации должна быть определена в классе обслуживания. Класс обслуживания должен наследовать метод Actor и переопределить метод получения родительского класса.
ссылка:https://www.cnblogs.com/shoufengwei/p/5856323.html
geotrellis.spart.etl //Обработка данных ETL Работа ETL заключается в разрезании данных на фрагменты и сохранении зеркального отображения. GeoTrellis поддерживает размещение данных в памяти или в распределенных базах данных, таких как Accumulo и HABSE, или HDFS и обычных файловых системах.
geotrellis.Ingest — это класс, который вызывает внутренний импорт данных Geotrellis, который вызывает класс ETL для автоматической загрузки данных.
EtlConf — это класс конфигурации для импорта данных в GeoTrellis. Вам необходимо создать экземпляр EtlConf, а затем передать его ETL для завершения импорта данных. Он основан на файлах Inputjson, output.json и backend-profiles.json.
Ввод: input.json //Ввод ETL Вывод: output.json //вывод ETL Сохранить: backend.json //Сохранение данных
ТРУБОПРОВОД трубопровод вычислительная мощность резка плитки SHP Конвертировать JSON векторная растеризация векторная плитка создать пирамиду
На основе плиток: Рендеринг в JPG: renderJpg Рендеринг в PNG: renderPng Цветовая карта: ColorMap Параметры [classBoundaryType noDataColor FallbackColor strict] ColorMap.fromQuantileBreaks
ссылка:https://www.cnblogs.com/shoufengwei/p/5753753.html
Получите плитку, соответствующую многоугольнику: val Masked = Raster.mask(polygon)
Объединить плитки: val стежок = Masked.stitch val tile = стежок.тайл
ссылка:https://www.cnblogs.com/shoufengwei/p/5753753.html
val rep = tile.reproject(extent, srcCRS, dstCRS, method).tile val res = rep.convert(cellType)
Резка плитки tile.crop(startcol, startrow, endcol, endrow)
Растровые срезы COG ФайлCOGLayerWriter COGLayer COGLayerМетаданные FileCOGValueReader
Импортируйте файлы данных, вам нужно добавить заголовок времени. Добавить заголовок времени через gdal gdal_edit -mo TIFFTAG_DATETIME = «время» yourtiff.tif
Добавьте информацию заголовка времени через GeoTrellis
val tiff = SinglebandGeoTiff(path) tiff.tags.headTags + (Tags.TIFFTAG_DATETIME -> time) val newtiff = new SinglebandGeoTiff(tiff.tile, tiff.extent, tiff.crs, Tags(map, tiff.tags.bandTags), tiff.options) newtiff.write(newTiffPath)
Изменить параметры импорта При импорте обычных данных TIFF используйте класс ETL: Etl.ingestProjectedExtent, SpatialKey, Tile
При импорте данных временных рядов: Etl.ingestTemporalProjectedExtent, SpaceTimeKey, Tile В основном добавляется поддержка времени, ProjectedExtent становится TemporalProjectExtent, SpatialKey становится SpaceTimeKey, если он многоканальный, Tile необходимо заменить на MultibandTile.
Изменить параметры импорта Чтобы изменить input.json, вам нужно всего лишь изменить формат с geotiff на temporal-geotiff в файле output.json, вам нужно изменить содержимое keyIndexMethod на следующее:
"keyIndexMethod":{
"type":"zorder",
"temporalResolution": 86400000,
"timeTag":"TIFFTAG_DATETIME",
"timeFormat":"yyyy:MM:dd HH:mm:ss"
}
TemporalResolution представляет точность времени. Теоретически установка этого значения означает, что при запросе на основе времени должна быть возможность запрашивать данные в этом диапазоне точности. На этом этапе данные временных рядов были импортированы в аккумулятор.
Получите соответствующие плитки временных рядов Служба регистрации передает время запроса, а также значения x, y и z плиток на задний план, а также запросы на основе этих четырех параметров. По сравнению с обычными запросами добавляются дополнительные временные условия.
val dt = DateTimeFormat.forPattern("yyyy:MM:dd HH:mm:ss").parseDateTime(time)
val key = SpaceTimeKey(x, y, dt)
val layerId = LayerId(name, zoom)
respondWithMediaType(MediaTypes.`image/png`) {
val result = {
val tile = tileReader.reader[SpaceTimeKey, Tile](layerId).read(key)
tile.renderPng.bytes
}
complete(result)
}
name указывает имя, в котором хранятся импортированные данные, а tileReader — это экземпляр AccumuloValueReader.
Таким образом, время, запрошенное пользователем, а также данные плиток x, y и z могут быть отображены и отправлены на стойку регистрации. Здесь необходимо подчеркнуть, что для обработки времени в Geotrellis используется платформа с открытым исходным кодом joda.
анализ данных Наклон: Наклон Чтобы прочитать тайлы, вызовите tile.slope склон Буфер: Buffer Растрированная геометрия:
Rasterizer.foreachCellByGeometry(geom, rasterExtent)(f)
ArrayTile(array, rasterExtent.cols, rasterExtent.rows)
Статистический анализ Информация о высоте: tile.histogram.
tile.histogram.foreach { (key, value) => { map(key.toDouble) = map(key.toDouble) + value }
weishoufeng: https://blog.csdn.net/luoye4321/article/category/9294349 https://blog.csdn.net/qq_32432081?t=1 https://www.cnblogs.com/shoufengwei/p/5619419.html
https://www.it610.com/article/1304061019752009728.htm