通过经纬度获取地区

读取文件后

 val jsonStr = Source.fromFile("data/nyc-borough-boundaries-polygon.geojson").mkString
val featureCollection = FeatureExtraction.parseJson(jsonStr)

//排序(区域最大的放最前面)
import scala.collection.JavaConversions._
val features = featureCollection.features.sortBy(feature=>(feature.properties("boroughCode"), -feature.getGeometry().calculateArea2D()))

 //广播
val featureBc = spark.sparkContext.broadcast(features)

/**
  * 根据经纬度查询所处区域,创建UDF函数
  * @param x
  * @param y
  * @return
  */
def findBorough(x:Double,y:Double):String= {
  val feature: Option[Feature] = featureBc.value.find(feature=>GeometryEngine.contains(feature.getGeometry(),new Point(x,y), SpatialReference.create(4326)))

  feature.map(p=>p.properties("borough")).getOrElse("NA")
}

//绑定udf函数
spark.udf.register("findBorough", findBorough _)

下面是解析json数据

import com.esri.core.geometry.{Geometry, GeometryEngine}
import org.json4s.JsonAST.JObject
import org.json4s.NoTypeHints
import org.json4s.jackson.Serialization

case class FeatureCollection(features: List[Feature])

case class Feature(properties: Map[String, String], geometry: JObject) {

  def getGeometry(): Geometry = {
 import org.json4s.jackson.JsonMethods._

val mapGeo = GeometryEngine.geoJsonToGeometry(compact(render(geometry)), 0, Geometry.Type.Unknown)
mapGeo.getGeometry
  }
}

object FeatureExtraction {

 // 完成具体的 JSON 解析工作
  def parseJson(json: String): FeatureCollection = {
import org.json4s.jackson.Serialization.read
// 1. 导入一个 formats 隐式转换
implicit val formats = Serialization.formats(NoTypeHints)
// 2. JSON -> Obj
val featureCollection = read[FeatureCollection](json)
featureCollection
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值