生产环境_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)

  }
}
相关推荐
ws20190722 分钟前
智驾与电池双线突破?AUTO TECH China 2026广州新能源汽车展解码产业新局
大数据·人工智能·科技·汽车
2501_9419820528 分钟前
企业微信外部群精准运营:API 主动推送消息开发指南
大数据·人工智能·企业微信
LuminescenceJ34 分钟前
GoEdge 开源CDN 架构设计与工作原理分析
分布式·后端·网络协议·网络安全·rpc·开源·信息与通信
2501_911067661 小时前
光能筑底,智联全城——叁仟智慧太阳能路灯杆重构城市基础设施新生态
大数据·人工智能·重构
Hello.Reader1 小时前
Flink JobManager 内存配置指南别让“控制面”先 OOM
大数据·flink
泰迪智能科技2 小时前
分享|联合编写教材入选第二批“十四五”职业教育国家规划教材名单
大数据·人工智能
TDengine (老段)2 小时前
TDengine 脱敏函数用户手册
大数据·服务器·数据库·物联网·时序数据库·iot·tdengine
鹧鸪云光伏3 小时前
一屏藏万象,智护光能源 —— 鹧鸪云电站大屏赋能新篇
大数据·能源·光伏
Hello.Reader4 小时前
写给生产环境的 Flink 内存配置Process Memory、TaskManager 组件拆解与场景化调优
大数据·flink
组合缺一4 小时前
论 AI Skills 分布式发展的必然性:从单体智能到“云端大脑”的跃迁
java·人工智能·分布式·llm·mcp·skills