Google S2常用操作

  • Google S2
    • 包引用
    • 经纬度 转 CellId
    • CellId 转 经纬度
    • S2计算距离
    • 经纬度构建任意形状
      • 经纬度构建S2矩形
      • 经纬度构建S2多边形
      • 经纬度构建圆形
    • 任意形状内所有S2块
    • 判断点是否在任意形状内
    • S2块包含的S2子块
    • 判断当前cellId的level

Google S2

包引用

 <dependency><groupId>io.sgr</groupId><artifactId>s2-geometry-library-java</artifactId><version>1.0.0</version></dependency>

经纬度 转 CellId

val s2LatLng : S2LatLng = S2LatLng.fromDegrees(lat, lng)
val celId = S2CellId.fromLatLng(s2LatLng)

CellId 转 经纬度

val s2LatLng = new S2CellId(celId).toLatLng
val lat = s2LatLng.latDegrees()
val lng = s2LatLng.lngDegrees()

S2计算距离

val startS2: S2LatLng = S2LatLng.fromDegrees(55.8241, 137.8347)
val endS2: S2LatLng = S2LatLng.fromDegrees(55.8271, 137.8347)
val dis = startS2.getEarthDistance(endS2)

经纬度构建任意形状

经纬度构建S2矩形

val startS2: S2LatLng = S2LatLng.fromDegrees(0.8293, 72.004) //左下角
val endS2: S2LatLng = S2LatLng.fromDegrees(55.8271, 137.8347) //右上角
val rect: S2LatLngRect = new S2LatLngRect(startS2, endS2)

经纬度构建S2多边形

val vertices = new util.ArrayList[S2Point]
//注意,一般需要多边形内侧,此处需要按照逆时针顺序添加。
vertices.add(S2LatLng.fromDegrees(lat, lng).toPoint)
val s2Loop = new S2Loop(vertices)
val polygon = new S2Polygon(s2Loop)

经纬度构建圆形

 double radius = 600.5; //半径val capHeight = (2 * S2.M_PI) * (radius / 40075017)S2LatLng s2LatLng= S2LatLng.fromDegrees(lat, lng);S2Cap cap = S2Cap.fromAxisHeight(s2LatLng.toPoint(),capHeight × capHeight / 2);

任意形状内所有S2块

val rect //构建的形状
val coverer: S2RegionCoverer = new S2RegionCoverer
coverer.setMaxLevel(7)
coverer.setMinLevel(7)
val list: util.ArrayList[S2CellId] = coverer.getCovering(rect).cellIds()

判断点是否在任意形状内

 val rect //构建的形状S2LatLng s2LatLng = S2LatLng.fromDegrees(lat, lng);boolean contains = rect.contains(s2LatLng.toPoint());

S2块包含的S2子块

求level=7的S2块下的level=8的4个子块的S2CellId,如下:

val s2CellId = S2CellId.fromLatLng(S2LatLng.fromDegrees(55.130666,88.700062)).parent(7)
val interval = (s2CellId.childEnd().id() - s2CellId.childBegin().id()) / 4
val childrenId = (0 until 4).flatMap(i => {val id = s2CellId.childBegin().id() + interval * ival cellId = new S2CellId(id).toLatLngList(cellId.lngDegrees(), cellId.latDegrees()).mkString(",")
}).mkString(";")

求level=7的S2块下的level=9的16个子块的S2CellId,如下:

val s2CellId = S2CellId.fromLatLng(S2LatLng.fromDegrees(55.130666,88.700062)).parent(7)
val chilren = childrenCellId(s2CellId, 7, 9)/**
* 求当前cellId下的所有 子cellId
* @param s2CellId 当前cellId
* @param curLevel 当前cellId的level 需与cellId保持一致
* @param desLevel 目标cellId的level 需大于当前cellId
* @return
*/
def childrenCellId(s2CellId: S2CellId, curLevel:Int, desLevel:Int): List[S2CellId] = {
if (curLevel < desLevel) {val interval = (s2CellId.childEnd().id() - s2CellId.childBegin().id()) / 4(0 until 4).flatMap(i => {val id = s2CellId.childBegin().id() + interval * ival cellId = new S2CellId(id)childrenCellId(cellId, curLevel + 1, desLevel)}).toList
} else List(s2CellId)
}

判断当前cellId的level

private static int getLevel(long input) {int n = 0;while (input % 2 == 0) {input = input / 2;n++;}return 30 - n / 2;
}

Google S2 常用操作相关推荐

  1. Google Earth 常用操作

    您的点赞和关注是我创作的最大动力~~ 历史影像查看 Google Earth Pro 点击工具栏上的 "show historical imagery" 按钮或者点击 " ...

  2. Google colab中常用操作

    Google colab中常用操作 1.执行命令行 1.1 执行python文件 1.2 执行.sh文件 1.3 执行R程序 1.3.1 加载rpy2.ipython 1.3.2 os.system( ...

  3. [PY3]——内置数据结构(3)——字符串及其常用操作

    字符串及其常用操作xmind图 字符串的定义 1. 单引号/双引号 In [1]: s1='hello world' In [2]: s1="hello world" 2. 三对单 ...

  4. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...

  5. python笔记之序列(str的基本使用和常用操作)

    序列 序列:列表(list),元组(tuple),字典(dict),集合(set),str,range() 有序列表: list,tuple 无序列表: dict,set 可变序列: list,dic ...

  6. 缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)

    输出缓冲区: 程序输入的数据并不能立即显示在屏幕上,而是先存储在输出缓冲区中,满足一些条件后才显示出来. 1.遇到\n后 2.遇到输入语句 3.当输出缓冲区满4K 4.当程序结束 5.手动刷新 ffl ...

  7. Google S2 中的 CellID 是如何生成的 ?

    笔者在<高效的多维空间点索引算法 - Geohash 和 Google S2>文章中详细的分析了 Google S2 的算法实现思想.文章发出来以后,一部分读者对它的实现产生了好奇.本文算 ...

  8. 谷歌Colab(免费算力平台)——正确打开方式(常用操作指导tips)

    简介 谷歌的colab自带一块GPU,配合谷歌云盘的存储,是一个很好的个人深度学习模型训练的平台. 初次接触colab会有很有碰壁和卡壳的地方,这篇博客会给出一些colab的常用操作指导,包括:数据集 ...

  9. CTime 和COleDateTime的常用操作和比较

    CTime 和COleDateTime的常用操作和比较 1) 获取当前时间. datetime = COleDateTime::GetCurrentTime(); CTime和COleDateTime ...

最新文章

  1. 学习完Ajax的总结
  2. Map集合的遍历(java)
  3. IIS7中的站点、应用程序和虚拟目录详细介绍
  4. 2017可以兼容那些jdk_2019从头跃——核心基础:何为JDK?Java开发工具包须知总览...
  5. Java基础学习路线送给零基础的朋友
  6. 使用ABAP调用BRF+ function
  7. 二维与三维之间的桥梁——点云
  8. python docker_Docker实践:python应用容器化
  9. MySQL忘记密码解决方案
  10. 当知识图谱遇上预训练语言模型
  11. VMware知识库中文文章列表 (更新2013年6月)
  12. 帝豪云星外对接SWAPIDC教程
  13. C#验证是不是合法的18位身份证号码
  14. 物联16:4 ISO/IEC 14443-3 防冲突、防碰撞算法、Type A、Type B
  15. Perl中use strict
  16. jquery+css实现流星雨特效
  17. IDA使用手册_(1)
  18. 如何阅读一份上市公司财报 - 财报阅读入门
  19. 试编写程序,利用前、中序序列或者后、中序序列唯一确定一棵二叉树。
  20. Android,使用MMKV存储Bean实体对象

热门文章

  1. 一次非常有趣的sql优化经历
  2. 管理神器下载地址(度娘网盘)
  3. 辨异 —— 近义词(词组)
  4. 给大家推荐的著名IT网站
  5. 第17章 多媒体通信系统技术
  6. Linux学习笔记之 LVM
  7. volte遇上VOWIFI
  8. 直流无刷电机(BLDC)应用中如何检测MOS好坏
  9. 利用Matplotlib进行科技论文绘图模板
  10. 如果要快速的读写表格,Pandas 并不是最好的选择