Обобщенные контурные линии
У меня есть таблица с тремя столбцами: latitude
, longitude
, а также y
, y
это некоторая реальная стоимость, которая плавно меняется по широте и долготе. Например, это может быть высота над уровнем моря. Я хочу найти геопространственную библиотеку, которая создает "обобщенные" контурные линии из этой таблицы. Затем я хочу наложить на это изображение карты (или наложить это на изображение карты - что угодно).
Я использую Spark/Scala для создания своей таблицы (DataFrame), и кажется, что GeoTrellis должна быть подходящей библиотекой, но я не могу найти хороший пример того, как это сделать.
Может ли кто-нибудь указать мне правильное направление? Я хочу продолжить со Spark. На данный момент я не привязан к GeoTrellis, но хочу использовать стабильную, хорошо документированную библиотеку.
До сих пор я сделал следующее:
import geotrellis.raster._
import geotrellis.raster.mapalgebra.focal.Kernel
import geotrellis.vector._
import org.apache.spark.sql.functions.{udf, _}
import org.apache.spark.sql.types._
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
import geotrellis.raster.render._
val lonMin = -97.55
val latMin = 18.75
val lonMax = -81.31
val latMax = 29.58
val latestDf: Dataset[Row] = getLatestReadings(dfTrim, lonMin, latMin, lonMax, latMax)
val min_max = dfTrim.agg(min("significantWaveHeight"), max("significantWaveHeight")).head()
val col_min = min_max.getDouble(0)
val col_max = min_max.getDouble(1)
val diff = col_max - col_min
val scaleFunc = udf((significantWaveHeight: Double) => {
math.round(((significantWaveHeight - col_min) / diff) * 16)
})
val scaledDf = latestDf.withColumn("significantWaveHeightScaled", scaleFunc(col("significantWaveHeight")))
scaledDf.printSchema()
scaledDf.show(false)
val pts: List[Feature[Point, Int]] =
scaledDf.rdd.map(
(r: Row) =>
Feature(Point(r.getDouble(r.fieldIndex("longitude")), r.getDouble(r.fieldIndex("latitude"))),
r.getInt(r.fieldIndex("significantWaveHeightScaled")))).collect().toList
val extent = Extent(lonMin, latMin, lonMax, latMax) // Extent of Gulf of Mexico
val kde: Tile = getKDETile(pts, extent)
val colorMap = ColorMap(
(0 to kde.findMinMax._2 by 4).toArray,
ColorRamps.HeatmapBlueToYellowToRedSpectrum
)
kde.renderPng(colorMap).write("test.png")
private def getKDETile(pts: List[Feature[Point, Int]], extent: Extent) = {
val kernelWidth: Int = 9
/* Gaussian kernel with std. deviation 1.5, amplitude 25 */
val kern: Kernel = Kernel.gaussian(kernelWidth, 1.5, 25)
val kde: Tile = pts.kernelDensity(kern, RasterExtent(extent, 700, 400))
kde
}
Проблема в том, что он не создает обобщенные контурные линии, как я описал.