生产环境_Spark处理轨迹中跨越本初子午线的经度列

使用spark处理数据集,解决gis轨迹点在地图上跨本初子午线的问题,这个问题很复杂,先补充一版我写的

Scala 复制代码
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

import org.apache.spark.sql.types.{StringType, StructField, StructType}

// by_20231215
// 作者:https://blog.csdn.net/qq_52128187?type=blog
object lon_benchuziwuxian {
  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("Parent_child_v3").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val spark = SparkSession.builder.appName("Parent_child_v3").getOrCreate()

    import spark.implicits._



    // 数据
    val data = Seq(
      (1, 178.0, 40.0, "2022-08-15 12:00:00"),
      (1, -179.0, 45.0, "2022-08-15 12:30:00"),
      (1, -170.0, 50.0, "2022-08-15 13:00:00")
    )

    // 数据集的schema
    val columns = Seq("id", "lon", "lat", "time")
    val trajDataFrame = data.toDF(columns: _*)

    // 处理跨越本初子午线的经度
    val processedDataFrame = trajDataFrame.withColumn("lon_processed",
      when(col("lon") < 0, col("lon") + 360).otherwise(col("lon")))

    processedDataFrame.show()

//    // 处理跨越本初子午线的经度
//    val processedDataFrame = trajDataFrame.withColumn("lon_processed",
//      when(col("lon") < 0, col("lon") + 360).otherwise(col("lon")))
//
//    // 按id和时间排序
//    val sortedDataFrame = processedDataFrame.orderBy("id", "time")
//
//    // 调整经度以避免跨越本初子午线
//    val adjustedDataFrame = sortedDataFrame.withColumn("lon_adjusted",
//      when(abs(col("lon_processed") - lag("lon_processed", 1).over(Window.partitionBy("id").orderBy("time"))) > 180,
//        when(col("lon_processed") > lag("lon_processed", 1).over(Window.partitionBy("id").orderBy("time")), col("lon_processed") - 360)
//          .otherwise(col("lon_processed") + 360)
//      ).otherwise(col("lon_processed"))
//    )
//
//    // 将经纬度点按时间形成一条轨迹字符串
//    val trajStringDF = adjustedDataFrame.groupBy("id").agg(collect_list(struct("lon_adjusted", "lat", "time")).as("trajectory"))
//
//    trajStringDF.show(false)

  }
}
相关推荐
喝醉酒的小白27 分钟前
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
大数据·elasticsearch·jenkins
yuanbenshidiaos2 小时前
【大数据】机器学习----------计算机学习理论
大数据·学习·机器学习
杰克逊的日记4 小时前
HBased的原理
大数据·hbase
小林想被监督学习4 小时前
RabbitMQ 在实际应用时要注意的问题
分布式·rabbitmq
S-X-S4 小时前
项目集成RabbitMQ
分布式·rabbitmq
DA02214 小时前
Win10系统部署RabbitMQ Server
分布式·rabbitmq
viperrrrrrrrrr76 小时前
大数据学习(36)- Hive和YARN
大数据·hive·学习
认知作战壳吉桔7 小时前
中国认知作战研究中心:从认知战角度分析2007年iPhone发布
大数据·人工智能·新质生产力·认知战·认知战研究中心
2301_780356708 小时前
为医院量身定制做“旧改”| 全视通物联网智慧病房
大数据·人工智能·科技·健康医疗
我的棉裤丢了10 小时前
windows安装ES
大数据·elasticsearch·搜索引擎