Google S2 常用操作
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 常用操作相关推荐
- Google Earth 常用操作
您的点赞和关注是我创作的最大动力~~ 历史影像查看 Google Earth Pro 点击工具栏上的 "show historical imagery" 按钮或者点击 " ...
- Google colab中常用操作
Google colab中常用操作 1.执行命令行 1.1 执行python文件 1.2 执行.sh文件 1.3 执行R程序 1.3.1 加载rpy2.ipython 1.3.2 os.system( ...
- [PY3]——内置数据结构(3)——字符串及其常用操作
字符串及其常用操作xmind图 字符串的定义 1. 单引号/双引号 In [1]: s1='hello world' In [2]: s1="hello world" 2. 三对单 ...
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...
- python笔记之序列(str的基本使用和常用操作)
序列 序列:列表(list),元组(tuple),字典(dict),集合(set),str,range() 有序列表: list,tuple 无序列表: dict,set 可变序列: list,dic ...
- 缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)
输出缓冲区: 程序输入的数据并不能立即显示在屏幕上,而是先存储在输出缓冲区中,满足一些条件后才显示出来. 1.遇到\n后 2.遇到输入语句 3.当输出缓冲区满4K 4.当程序结束 5.手动刷新 ffl ...
- Google S2 中的 CellID 是如何生成的 ?
笔者在<高效的多维空间点索引算法 - Geohash 和 Google S2>文章中详细的分析了 Google S2 的算法实现思想.文章发出来以后,一部分读者对它的实现产生了好奇.本文算 ...
- 谷歌Colab(免费算力平台)——正确打开方式(常用操作指导tips)
简介 谷歌的colab自带一块GPU,配合谷歌云盘的存储,是一个很好的个人深度学习模型训练的平台. 初次接触colab会有很有碰壁和卡壳的地方,这篇博客会给出一些colab的常用操作指导,包括:数据集 ...
- CTime 和COleDateTime的常用操作和比较
CTime 和COleDateTime的常用操作和比较 1) 获取当前时间. datetime = COleDateTime::GetCurrentTime(); CTime和COleDateTime ...
最新文章
- 学习完Ajax的总结
- Map集合的遍历(java)
- IIS7中的站点、应用程序和虚拟目录详细介绍
- 2017可以兼容那些jdk_2019从头跃——核心基础:何为JDK?Java开发工具包须知总览...
- Java基础学习路线送给零基础的朋友
- 使用ABAP调用BRF+ function
- 二维与三维之间的桥梁——点云
- python docker_Docker实践:python应用容器化
- MySQL忘记密码解决方案
- 当知识图谱遇上预训练语言模型
- VMware知识库中文文章列表 (更新2013年6月)
- 帝豪云星外对接SWAPIDC教程
- C#验证是不是合法的18位身份证号码
- 物联16:4 ISO/IEC 14443-3 防冲突、防碰撞算法、Type A、Type B
- Perl中use strict
- jquery+css实现流星雨特效
- IDA使用手册_(1)
- 如何阅读一份上市公司财报 - 财报阅读入门
- 试编写程序,利用前、中序序列或者后、中序序列唯一确定一棵二叉树。
- Android,使用MMKV存储Bean实体对象