经纬度转换

Redis 到底是如何实现“附近的人”这个功能呢?

浪尽此生 提交于 2019-12-03 07:05:35
针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度。 操作命令 自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能。 Redis Geo模块包含了以下6个命令: GEOADD: 将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOPOS: 从key里面返回所有给定位置对象的位置(经度和纬度); GEODIST: 返回两个给定位置之间的距离; GEOHASH: 返回一个或多个位置对象的Geohash表示; GEORADIUS: 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象; GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。 其中,组合使用GEOADD和GEORADIUS可实现“附近的人”中“增”和“查”的基本功能。要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。其中“给定的位置对象”即为用户本人,搜索的对象为其他用户。不过本质上,GEORADIUSBYMEMBER =

计算两个点的经纬度的距离

匿名 (未验证) 提交于 2019-12-03 00:22:01
package com.yuncai.core.common.utils ; import java.util.HashMap ; import java.util.Map ; /** * 计算两个坐标的距离 * @author audaque * */ public class DistanceUtils { private static final double EARTH_RADIUS = 6378137 ; //赤道半径(单位m) private DistanceUtils (){ } /** * 转化为弧度(rad) * */ private static double rad ( double d) { return d * Math. PI / 180.0 ; } /** * 基于googleMap中的算法得到两经纬度之间的距离,计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下 * @param lng1 第一点的精度 * @param lat1 第一点的纬度 * @param lng2 第二点的精度 * @param lat2 第二点的纬度 * @return 返回的距离(凑整),单位m * */ public static int getDistance ( double lng1 ,double lat1 ,double lng2 , double

经纬度偏移转换

匿名 (未验证) 提交于 2019-12-02 22:06:11
在进行地图开发过程中,一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用; 2.GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系; 3.百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API) using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Extensions { public class GpsExtension { public static double pi = 3.1415926535897932384626

Redis 到底是怎么实现“附近的人”这个功能的?

时光怂恿深爱的人放手 提交于 2019-12-01 18:25:52
前言 : 针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。 而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。 本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度。 要提供完整的“附近的人”服务,最基本的是要实现“增”、“删”、“查”的功能。以下将分别进行介绍,其中会重点对查询功能进行解析。 操作命令 自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能。Redis Geo模块包含了以下6个命令: GEOADD : 将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOPOS: 从key里面返回所有给定位置对象的位置(经度和纬度); GEODIST: 返回两个给定位置之间的距离; GEOHASH: 返回一个或多个位置对象的Geohash表示; GEORADIUS : 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象; GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。 其中,组合使用GEOADD和GEORADIUS可实现“附近的人”中“增”和“查”的基本功能。 要实现微信中“附近的人”功能

Geohash精度和原理

落爺英雄遲暮 提交于 2019-11-27 22:25:36
转自: https://blog.csdn.net/u011497262/article/details/81210634     https://www.jianshu.com/p/1ecf03293b9a geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索 目录: 经纬度常识 认识geohash geohash算法 geohash原理 对照表 经纬度常识 经线是纵的,经度是横的,用于表示不同的经线,纬线是横的,纬度是纵的,用于表示不同的纬线,如下图 纬线:地球仪上的横线,lat,赤道是最大的纬线,从赤道开始分为北纬和南纬,都是0-90°,纬线是角度数值,并不是米; 经线:地球仪上的竖线,lng,子午线为0°,分为西经和东经,都是0-180°,经线也是角度数值; 经纬线和米的换算:经度或者纬度0.00001度,约等于1米,这个在GPS测算距离的时候可以体会到,GPS只要精确到小数点后五位,就是10米范围内的精度 经度0度的位置为本初子午线,在180度的位置转为西经,数字由大到小依次经过北美洲到达西欧.纬度0度的位置为赤道 为了便于理解,将地球看成一个基于经纬度线的坐标系。纬线就是平行于赤道平面的那些平面的周线,经线就是连接南北两极的大圆线的半圆弧

常用的一些GIS知识概念

和自甴很熟 提交于 2019-11-26 15:54:16
参考: https://www.jianshu.com/p/68288ff89ab4 作者:GIS前沿 来源:简书 目录: 1.经纬度与GCS(Geographic Coordinate System, 地理坐标系统)     1.1 参心坐标系、地心坐标系     1.2 我国常见GCS        1.2.1 北京54坐标系(参心)        1.2.2 西安80坐标系(参心)        1.2.3 WGS84坐标系(地心)        1.2.4 CGCS2000坐标系(地心) 2. 平面坐标与PCS(Projection Coordinate System, 投影坐标系统)     2.1 高斯克吕格投影/横轴墨卡托投影     2.2 墨卡托投影     2.3 通用横轴墨卡托投影(UTM投影)     2.4 Lambert投影     2.5 Albers投影     2.6 Web墨卡托(WebMercator投影) 3.坐标系的转换问题     3.1 GCS转GCS (地理坐标系之间的转换)     3.2 GCS转PCS(地理坐标系转投影坐标系)     3.3 PCS转PCS(重投影-投影坐标系之间的转换) 4.常用的一些GIS名词概念     4.1 地形图坐标系——中央经线、伪东、伪北     4.2 六度带、三度带     4.3