1.关于S2框架的一些知识

为避免翻译造成的部分名词的歧义和理解上的不便,我将Google S2的源代码和说明直接贴出来 (如果无法访问该网址请在我的GIT@OSC项目 Google-S2-demo下载文档。

Google Code S2在Google Code上的项目地址

Foursquare的S2的论文

S2Map算法的地图测试站点

2.使用S2计算空间地理位置

S2使用的是WGS84坐标(GPS导航坐标),如果你获得的是百度或者高德的地理坐标,请将其转换为GPS坐标,以防止计算的位置不准确。 2.1 计算地球上两个点之间的距离

double lat = 22.629164;double lgt =114.025514 ;S2LatLng s2LatLng = S2LatLng.fromDegrees(lat, lgt);S2Point s2Point = s2LatLng.toPoint();double earthDistance = s2LatLng.getEarthDistance(new S2LatLng(s2Point)); //单位为mSystem.out.println(earthDistance); //输出距离为0//s2LatLng.getDistance() //可以用于计算两点之间的弧度距离

2.2 计算地球上某个点是否在矩形区域内

String[] split = "114.025914,22.629364".split(",");String[] coord = "114.027745,22.623408".split(",");S2LatLngRect rect = new S2LatLngRect(S2LatLng.fromDegrees(Double.valueOf(split[1]),Double.valueOf(split[0])),S2LatLng.fromDegrees(Double.valueOf(coord[1]),Double.valueOf(coord[0])));// S2RegionCoverer coverer = new S2RegionCoverer();//设置cell//        coverer.setMinLevel(8);//        coverer.setMaxLevel(15);//        coverer.setMaxCells(500);//        S2CellUnion covering = coverer.getCovering(rect);double lat = 22.629164;double lgt =114.025514 ;S2LatLng s2LatLng = S2LatLng.fromDegrees(lat, lgt);boolean contains = rect.contains(s2LatLng.toPoint());System.out.println(contains);

2.3 计算点是否在在圆形区域内

double lng = 112.030500;double lat = 27.970271;double capHeight = 600.5; //半径S2LatLng s2LatLng= S2LatLng.fromDegrees(lat, lng);S2Cap cap = S2Cap.fromAxisHeight(s2LatLng.toPoint(),capHeight);double lat2 = 22.629164;double lgt2 =114.025514 ;S2LatLng s2LatLng = S2LatLng.fromDegrees(lat2, lng2);boolean contains = cap.contains(s2LatLng.toPoint());System.out.println(contains);

2.3 计算点是否在在多边形内

String str = "114.025914,22.629364;114.027745,22.623408;114.028944,22.619712;114.030112,22.617669;114.033967,22.612966;114.042343,22.602816;114.046114,22.603997;114.048353,22.604289;114.049606,22.604455;114.050796,22.604898;114.051728,22.605412;114.053186,22.606647;114.054171,22.608369";double lat = 22.629164;double lgt =114.025514 ;List<S2Point> vertices = Lists.newArrayList();for (String token : Splitter.on(';').split(str)) {int colon = token.indexOf(',');if (colon == -1) {throw new IllegalArgumentException("Illegal string:" + token + ". Should look like '114.139312,22.551337;114.120260,22.535537'");}double lngY = Double.parseDouble(token.substring(0, colon));double latX = Double.parseDouble(token.substring(colon + 1));vertices.add(S2LatLng.fromDegrees(latX, lngY).toPoint());}S2Loop s2Loop = new S2Loop(vertices);S2Polygon polygon = new S2Polygon(s2Loop); //创建多边形S2Point s2Point = S2LatLng.fromDegrees(lat, lgt).toPoint();boolean contains = polygon.contains(s2Point);System.out.println(contains);

2.3 计算两个区域是否有交集

//计算一个正方形和多边形之间是否有交集
String str = "114.025914,22.629364;114.027745,22.623408;114.028944,22.619712;114.030112,22.617669;114.033967,22.612966;114.042343,22.602816;114.046114,22.603997;114.048353,22.604289;114.049606,22.604455;114.050796,22.604898;114.051728,22.605412;114.053186,22.606647;114.054171,22.608369";double lat = 22.629164;double lgt =114.025514 ;List<S2Point> vertices = Lists.newArrayList();for (String token : Splitter.on(';').split(str)) {int colon = token.indexOf(',');if (colon == -1) {throw new IllegalArgumentException("Illegal string:" + token + ". Should look like '114.139312,22.551337;114.120260,22.535537'");}double lngY = Double.parseDouble(token.substring(0, colon));double latX = Double.parseDouble(token.substring(colon + 1));vertices.add(S2LatLng.fromDegrees(latX, lngY).toPoint());}S2Loop s2Loop = new S2Loop(vertices);S2Polygon polygon = new S2Polygon(s2Loop);S2Point s2Point = S2LatLng.fromDegrees(lat, lgt).toPoint();boolean contains = polygon.contains(s2Point);System.out.println(contains);String[] split = "114.025914,22.629364".split(",");String[] coord = "114.027745,22.623408".split(",");S2LatLngRect rect = new S2LatLngRect(S2LatLng.fromDegrees(Double.valueOf(split[1]),Double.valueOf(split[0])),S2LatLng.fromDegrees(Double.valueOf(coord[1]),Double.valueOf(coord[0])));S2RegionCoverer coverer = new S2RegionCoverer();//设置cellcoverer.setMinLevel(8);coverer.setMaxLevel(15);coverer.setMaxCells(500);S2CellUnion covering = coverer.getCovering(rect);for (S2CellId s2CellId : covering.cellIds()) {boolean b = polygon.mayIntersect(new S2Cell(s2CellId));if (b){System.out.println("两个区域之间含有交集.....");}}

3.关于S2框架的计算性能和精度

综合我目前在项目中的使用情况来看,S2框架的性能比我自己利用计算机图形学上的实现的地理空间位置计算算法更好,而且由于S2使用了索引机制并使用希伯来曲线来建立多层次的CellID,在计算的精确度上肯定是S2框架更高。个人推荐你使用S2解决空间位置计算位置,S2也有多种语言的实现,如PHP,Python等。

4.将Google-S2框架构的Maven项目依赖

因为Google官方并没有在Maven上发布Google-S2-Java的Maven依赖包,所以在项目中需要自己将S2项目的源码重构为一个Maven项目,然后上传到局域网的Maven私服中,方便项目使用。 我在GIT@OSC上已经将Google-S2项目重构为一个Maven项目,大家要使用的可以直接Clone下来。

Google-S2 空间索引框架简介及部分API使用示例相关推荐

  1. TensorFlow:实战Google深度学习框架(五)图像识别与卷积神经网络

    第6章 图像识别与卷积神经网络 6.1 图像识别问题简介及经典数据集 6.2 卷积神经网络简介 6.3 卷积神经网络常用结构 6.3.1 卷积层 6.3.2 池化层 6.4 经典卷积神经网络模型 6. ...

  2. knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

    knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量, ...

  3. 06.图像识别与卷积神经网络------《Tensorflow实战Google深度学习框架》笔记

    一.图像识别问题简介及经典数据集 图像识别问题希望借助计算机程序来处理.分析和理解图片中的内容,使得计算机可以从图片中自动识别各种不同模式的目标和对象.图像识别问题作为人工智能的一个重要领域,在最近几 ...

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

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

  5. nanomsg框架简介

    1.nanomsg概述 Ø  nanomsg是一个socket library,它提供了几种常见的通信模式,为了能使网络层快速.可扩展并且能易于使用.用C实现,且适用于广泛的操作系统,几乎不需要依赖. ...

  6. 第三方框架简介ios

    第三方框架简介iOS 图像 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片 ...

  7. Google Cloud Messaging(GCM)简介与基本使用

    Google Cloud Messaging(GCM)简介与基本使用 官方文档参考:https://developers.google.com/cloud-messaging/gcm GCM简介 Go ...

  8. 几种常用深度学习框架简介

    几种常用深度学习框架简介 一.TensorFlow 1.1 Tensorflow简介 1.2 使用文档 1.3 预训练模型 二.Pytorch 2.1 Pytorch简介 2.2 使用文档 2.3 预 ...

  9. (转)Tensorflow 实战Google深度学习框架 读书笔记

    本文大致脉络: 读书笔记的自我说明 对读书笔记的摘要 具体章节的摘要: 第一章 深度学习简介 第二章 TensorFlow环境搭建 第三章 TensorFlow入门 第四章 深层神经网络 第五章 MN ...

最新文章

  1. 路由器计算机无法上网,路由器安装后电脑无法上网怎么办
  2. 使用代理下载android系统源码和SDK
  3. 宅男程序员给老婆的计算机课程之8:控制器
  4. django-allauth定制模板(转载)
  5. 干活的不如写ppt的吗_干活的干不过写PPT的?或许只是工作汇报的方式错了……...
  6. js实现鼠标放在一级菜单,下滑出二级菜单
  7. 《精通 ASP.NET MVC 3 框架(第三版)》----第1章 设计思路 1.1 Web开发简史
  8. python的if语句后面怎么加布尔运算符号是_10、python---- if布尔条件控制语法(二)...
  9. 表达式计算引擎-JEP
  10. SPSS 24 安装详细教程及下载
  11. 理解Android中的MeasureSpec
  12. 运放输入偏置电流方向_运算放大器输入偏置电流的两种测试方法研究
  13. 微信小程序打印实时日志
  14. 五大方法 永久彻底关闭WIN10系统自动更新【已验证有效】
  15. MySQL局域网连接失败问题解决
  16. icinga-cn-1.11.1启动ido2db报错Starting Ido2db
  17. python星号直角三角形边长公式_三角形边长计算公式大全
  18. centos7对普通用户授权sudo权限
  19. JAVA笔试题笔记(二)
  20. 梦幻西游唯美版3D模型展示

热门文章

  1. bootstrap-editable版本踩坑记
  2. 含有吲哚基团132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸
  3. ​LeetCode刷题实战631:设计 Excel 求和公式
  4. vue+nuxtjs中使用swiper( vue-awesome-swiper)缩略图(双向控制)
  5. RichTextBox控件
  6. Winsdows黑客技术入门---简介
  7. vs学习问题 关于打开程序时不是有效的Win32应用程序
  8. 用户行为数据分析——数据埋点篇
  9. 解决opencv中cv2.VideoCapture()函数打开USB视频慢的问题
  10. 内存溢出的几种原因和解决办法