Обобщенные контурные линии

У меня есть таблица с тремя столбцами: 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

  }

Проблема в том, что он не создает обобщенные контурные линии, как я описал.

0 ответов

Другие вопросы по тегам