一:使用高德地图的接口

获取key的步骤:

1.申请网站:

https://lbs.amap.com/

2.登陆注册

3.选择开发支持–>web服务API

4.进入控制台–>我的应用

5.新建应用–>创建key

6.添加key

7.生成key

8.选择逆地理编码–>查看示例

9.服务示例

服务示例
https://restapi.amap.com/v3/geocode/regeo?output=xml&location=116.310003,39.991957&key=<用户的key>&radius=1000&extensions=all

参数:
1.key:用户申请的key
2. location: 经纬度 , 格式 : 经度,纬度
3. radius: 搜索半径
4. extensions: 返回结果控制
5. output: 输出内容格式,可选 JSON,XML

10.示例的修改和使用

需求: JSON格式 / 只要businessAreas信息

https://restapi.amap.com/v3/geocode/regeo?&location=%s&key=47a5fdc15f2b7cd24653073319ed5763

解释:
默认output = JSON格式
location=%s 占位作用,方便后续根据经纬度进行参数提交
URL="http://restapi.amap.com/v3/geocode/regeo?location=%s&key=47a5fdc15f2b7cd24653073319ed5763 "

使用默认经纬度的显示结果:
需求:获取businessAreas
格式: regeocode.addressComponent.businessAreas
{"status":"1","regeocode":{"addressComponent":{"city":[],"province":"北京市","adcode":"110108","district":"海淀区","towncode":"110108015000","streetNumber":{"number":"5号","location":"116.310454,39.9927339","direction":"东北","distance":"94.5489","street":"颐和园路"},"country":"中国","township":"燕园街道","businessAreas":[{"location":"116.303364,39.97641","name":"万泉河","id":"110108"},{"location":"116.314222,39.98249","name":"中关村","id":"110108"},{"location":"116.294214,39.99685","name":"西苑","id":"110108"}],"building":{"name":"北京大学","type":"科教文化服务;学校;高等院校"},"neighborhood":{"name":"北京大学","type":"科教文化服务;学校;高等院校"},"citycode":"010"},"formatted_address":"北京市海淀区燕园街道北京大学"},"info":"OK","infocode":"10000"}

二:代码示例

1.解析URL工具类

--scala语言编程import org.apache.commons.httpclient.HttpClient
import org.apache.commons.httpclient.methods.{GetMethod, PostMethod}//解析URL工具类
object HttpUtils {//发起get请求def get(url:String): Unit ={//1.获取HttpClientval client = new HttpClient()//2.GetMethod获取get请求方式 , PostMethod则是获取post请求val getMethod = new GetMethod(url)//3.发起请求//返回状态码val code: Int = client.executeMethod(getMethod)//4.判断状态码,如果是200就是成功的,否则没有结果if (code==200){//返回响应体getMethod.getResponseBodyAsString}else{//否则返回空字符串""}}
}

2.解析Json工具类


package com.wonderland.utilsimport java.utilimport com.alibaba.fastjson.{JSON, JSONObject}//解析Json工具类
object ParseJsonUtils {def parseJson(json:String)={//使用alibaba 的fastjson 进行解析val obj: JSONObject = JSON.parseObject(json)//最外层的keyval regeocode = obj.getJSONObject("regeocode")//获取第二层keyval addressComponent = regeocode.getJSONObject("addressComponent")//获取目标层keyval businessAreas = addressComponent.getJSONArray("businessAreas")//获取目标层businessAreas数据,把每条json数据转成对象,再把对象存进集合中val areas: util.List[BusinessArea] = businessAreas.toJavaList(classOf[BusinessArea])//导入集合转换import scala.collection.JavaConversions._//获取所有name的值,使用逗号分隔areas.map(_.name).mkString(",")}
}
//创建一个object,接收json数据,因为json数据格式{"location":"116.303364,39.97641","name":"万泉河","id":"110108"}
//所以需要三个变量
//传递给 toJavaObject()
case class BusinessArea(id:String,location:String,name:String)

3.主类解析URL,获取商圈

package com.procimport ch.hsr.geohash.GeoHash
import com.wonderland.utils._
import org.apache.kudu.client.CreateTableOptions
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}import scala.util.Tryobject BusinessAreaProcess {//创建sink表val TABLENAME =s"Business_Area_Process_${DateUtils.getDate()}"def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSessionUtils.getSparkSession()import spark.implicits._//读取ODS的表import org.apache.kudu.spark.kudu._val source: DataFrame = spark.read.option("kudu.master", ConfigUtils.KUDU_MASTER).option("kudu.table", "ODS_${DateUtils.getDate()}").kudu//列裁剪,去重,过滤  获取经纬度val ds1: Dataset[(String, String)] = source.selectExpr("longitude", "latitude").filter("longitude is not null and latitude is not null ") //注意,这里不能使用''过滤,否则把全部信息过滤了.distinct().as[(String, String)]//获取商圈,需要参数是 : 经度,纬度val result = ds1.map(item => {val longitude = item._1val latitude = item._2//拼接经纬度,作为解析URL的参数val params = s"${longitude},${latitude}"//将参数传入URL中,因为URL中的location使用%s占位了val url: String = ConfigUtils.URL.format(params)//使用工具类进行解析URL,发起请求,获取响应信息val responseJson: String = HttpUtils.get(url)//解析json结果--使用ParseJsonUtils工具类--避免解析出错val areas: String = Try(ParseJsonUtils.parseJson(responseJson)).getOrElse("")//对经纬度进行geoHash编码,作用: 把相邻的经纬度生成同一个编码,这样才会在同一个商圈中//三个参数 : latitude: Double, longitude: Double, numberOfCharacters: Intval geoHashCode: String = GeoHash.geoHashStringWithCharacterPrecision(latitude.toDouble, longitude.toDouble, 8)//返回数据(geoHashCode,areas)}).toDF("geoHashCode", "areas").filter("areas is not null and areas != '' ").distinct()//获取到result,把数据写入Kuduval schema = result.schemaval keys = Seq("geoHashCode")val options = new CreateTableOptionsimport scala.collection.JavaConversions._options.addHashPartitions(Seq("geoHashCode"), 3)options.setNumReplicas(1)WriterUtils.write(spark, TABLENAME, schema, keys, options, result)}
}

注;
未显示的工具类有:
application.conf 配置文件,存放URL
ConfigUtils 配置文件工具类,用于获取配置信息
WriterUtils kudu写入工具类,用于把数据写入kudu表格中

基于经纬度进行商圈定位相关推荐

  1. html5经纬度定位 源码_基于浏览器的HTML5地理定位

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理和一个 ...

  2. 咖啡馆如何进行商圈分析确定选址地点

    咖啡馆如何进行商圈分析确定选址地点 开业地址选对了,咖啡馆成功率就达到了70%,可见选址的重要性.既然你已经决定了要干下去,下一步就是确定最佳的经营位置,建立选址的标准.下面小编就为大家解开便利店选址 ...

  3. 基本农田卫星地图查询_如何基于西安80坐标查询定位

    1. 概述 水经注软件除了可以轻松下载无水印Google Earth卫星影像.有明确拍摄日期的历史影像.地方高清天地图.百度高德大字体打印地图,且可按1万/5千等国家标准图幅下载,下载含高度的全国矢量 ...

  4. html定位的实例,H5案例分享:基于浏览器的HTML5地理定位

    基于浏览器的HTML5地理定位 地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML ...

  5. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  6. 如何基于西安80坐标查询定位

    1. 概述 水经注软件除了可以轻松下载无水印Google Earth卫星影像.有明确拍摄日期的历史影像.地方高清天地图.百度高德大字体打印地图,且可按1万/5千等国家标准图幅下载,下载含高度的全国矢量 ...

  7. 一种基于贝塞尔曲线的终端定位轨迹拟合方法

    一种基于贝塞尔曲线的终端定位轨迹拟合方法 专利名称一种基于贝塞尔曲线的终端定位轨迹拟合方法 技术领域本发明属于卫星导航领域,具体涉及一种基于贝塞尔曲线的终端定位轨迹拟合方法. 背景技术目前有很多设备( ...

  8. O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)

    这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天,厚着脸皮在八大赛区的群里发消息求关注,之后就陷入 ...

  9. 手机室内地磁定位软件_一种基于地磁的智能手机实时定位方法与流程

    本发明涉及室内地磁定位导航方法,具体涉及一种基于地磁的智能手机实时定位方法,属于移动计算和室内定位技术领域. 背景技术: 随着室内定位导航的日益需求,利用地磁信息作为位置指纹的室内定位导航技术显示出其 ...

最新文章

  1. cheat engine lua
  2. 某程序员吐槽:31岁小姐姐拒绝条件优越的大厂程序员,只因身高不足163cm,难道矮是原罪?...
  3. java正则表达式所有字符串_java正则表达式获取字符串中所有匹配的内容
  4. C、C++中的转义符
  5. docker的容器管理和网络模式
  6. python代码模块与模块之间空1行_Day006|Python语法基础
  7. 使用docker开启nginx
  8. 用PHP做一道单选选择题的页面,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
  9. 计算机网络的一大发展趋势是多维化,对口高考计算机网络概述复习.ppt
  10. 我的技术博客开通了!
  11. ModelSim仿真实例教程
  12. 学习笔记(01):ThreeJS视频教程-了解着色器基础
  13. Python-while 计算100以内奇数和
  14. iphone屏幕镜像如何全屏_苹果手机投到电视上能全屏嘛
  15. 特殊回文数,123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。蓝桥杯问题一次性解答,含JAVA,C++代码
  16. 全网最通俗易懂的「插屏广告」接入方法
  17. 【统计学习方法】第10章 隐马尔可夫模型
  18. 解决主机和虚拟机相互ping通,但是虚拟机无法上网
  19. XML常见的两种解析方式总结
  20. 电脑公司 GHOST WIN10 X64 装机专业版 V2018.04(64位)

热门文章

  1. 计算机无法打开压缩包,电脑压缩文件为什么打不开?手把手教你解决压缩文件打不开的问题...
  2. 解决 el-input 密码输入框浏览器自动填充账号密码问题
  3. Prolog教程 12
  4. 2021年南京航空航天大学计算机学院考研信息
  5. dp主机_HDMI和DP是什么?一文看懂两种接口的区别
  6. Android 深入系统完全讲解(一)
  7. MES系统国内厂商排名
  8. steam下载缓慢解决方法
  9. 【转载】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
  10. win10自带输入法在切换中英文的过程中,出现了输入字符所占间距变大的问题