经纬度

sqlserver空间数据 + c# 实现查询附近的设备

点点圈 提交于 2020-03-16 14:50:51
前言 一个小需求的实现,做一个备忘,个人理解,可能存在错误。 客户有很多设备,这些设备分散在不同的地方,现在需要通过小程序获取附近的(比如1000米)之类的设备列表,以距离排序 第一个想到的的是找百度/腾讯等地图,看有没有提供相应的开放api,先将我们的设备id以及对应的经纬度存储到地图中,再调用某个api,传入我当前坐标经纬度,然后返回附近的设备列表。最后没找到这个接口。应该是有,但是我没找到 第二个想能不能通过c#用啥算法实现,太菜搞不定 最后想到sqlserver有个空间数据的概念,最终勉强实现。 参考: 空间数据 (SQL Server) efcore中使用空间数据 概述 空间对象其实就是点、线、面之类的意思,我们希望对其进行一些操作,如:查询得到两个面之间的交集/差集/并集;以一个点为中心,设置半径得到一个面;查询两个点之间的距离;等等。这些操作如果我们自己用算法来实现想想有点怕。 c#提供了相应的库来表示这些空间对象,也提供了相应的方法来执行针对空间对象的操作 -> NetTopologySuite (从java的JTS移植来的)由于这次小需求只是依赖了数据库对空间数据的支持,所以没有详细研究 NetTopologySuite (资料少) sqlserver2008开始支持空间数据,它也提供了相应的类型来表示空间对象,也提供相应的函数来操作这些对象,当然其它数据也支持

LBS中从数据库查询某经纬度2KM范围内的数据 - 针对大数据量的性能优化

六月ゝ 毕业季﹏ 提交于 2020-03-16 04:22:21
之前很啥很天真地以为无非就是逐个计算距离,然后比较出来就行了,然后当碰到访问用户很多,而且数据库中经纬度信息很多的时候,计算量的迅速增长,能让服务器完全傻逼掉,还是老前辈的经验比我们丰富,给了我很大的启示。 MySQL 性能 调优 – 使用更为快速的 算法 进行距离计算 最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询 优化 到了0.01秒,效率提高了100倍. 问题是这样的,有一张存放 用户 居住地点经纬度信息的MySQL数据表,表结构可以简化 为:id(int),longitude(long),latitude()long. 而业务 系统 中有一个功能是查找离某个用户最近的其余数个用户,通过代码分析,可以确定原先的做法基本是这样的: //需要查询的用户的坐标 $lat=20; $lon=20;//执行查询,算出该用户与所有其他用户的距离,取出最近的10个 $sql='select * from users_location order by ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.' * 3.1415) /

sql语句查询经纬度范围

混江龙づ霸主 提交于 2020-03-16 04:19:05
指定一个经纬度,给定一个范围值(单位:千米),查出在经纬度周围这个范围内的数据。 经度:113.914619 纬度:22.50128 范围:2km longitude为数据表经度字段 latitude为数据表纬度字段 SQL在mysql下测试通过,其他数据库可能需要修改 SQL语句如下: select * from location where sqrt( ( ((113.914619-longitude)*PI()*12656*cos(((22.50128+latitude)/2)*PI()/180)/180) * ((113.914619-longitude)*PI()*12656*cos (((22.50128+latitude)/2)*PI()/180)/180) ) + ( ((22.50128-latitude)*PI()*12656/180) * ((22.50128-latitude)*PI()*12656/180) ) )<2 MySQL性能调优 – 使用更为快速的算法进行距离 最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询优化到了0.01秒,效率提高了100倍. 问题是这样的,有一张存放用户居住地点经纬度信息的MySQL数据表,表结构可以简化 为:id(int),longitude(long),latitude()long.

Redis(6)——GeoHash查找附近的人

人盡茶涼 提交于 2020-03-12 08:34:55
像微信 "附近的人" ,美团 "附近的餐厅" ,支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一、使用数据库实现查找附近的人 我们都知道,地球上的任何一个位置都可以使用二维的 经纬度 来表示,经度范围 [-180, 180] ,纬度范围 [-90, 90] ,纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。比如说,北京人民英雄纪念碑的经纬度坐标就是 (39.904610, 116.397724) ,都是正数,因为中国位于东北半球。 所以,当我们使用数据库存储了所有人的 经纬度 信息之后,我们就可以基于当前的坐标节点,来划分出一个矩形的范围,来得知附近的人,如下图: 所以,我们很容易写出下列的伪 SQL 语句: SELECT id FROM positions WHERE x0 - r < x < x0 + r AND y0 - r < y < y0 + r 如果我们还想进一步地知道与每个坐标元素的距离并排序的话,就需要一定的计算。 当两个坐标元素的距离不是很远的时候,我们就可以简单利用 勾股定理 就能够得出他们之间的 距离 。不过需要注意的是,地球不是一个标准的球体, 经纬度的密度 是 不一样 的,所以我们使用勾股定理计算平方之后再求和时,需要按照一定的系数 加权 再进行求和。当然,如果不准求精确的话,加权也不必了。 参考下方

iOS定位--CoreLocation框架

家住魔仙堡 提交于 2020-03-07 07:43:46
CoreLocation框架的使用 // 首先导入头文件 #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是CL CoreLocation中使用CLLocationManager对象来做用户定位 1.CLLocationManager的使用 CLLocationManager的常用操作 /** * 定位管理者,全局变量强引用,防止销毁 */ @property (nonatomic ,strong) CLLocationManager *mgr; 设代理 // 2.成为CoreLocation管理者的代理监听获取到的位置 self.mgr.delegate = self; ①得到用户授权 注意: iOS7只要开始定位, 系统就会自动要求用户对你的应用程序授权. 但是从iOS8开始, 想要定位必须先"自己""主动"要求用户授权 添加友好提示,在info.plist文件中添加字段 Privacy - Location Usage Description 在iOS8中不仅仅要主动请求授权,而且必须再info.plist文件中配置一项属性才能弹出授权窗口 NSLocationWhenInUseDescription,允许在前台获取GPS的描述 NSLocationAlwaysUsageDescription

php通过经纬度计算直线距离

本秂侑毒 提交于 2020-03-01 10:52:45
<?php /** * php通过经纬度计算直线距离 方法一 * @param $latitudeA * @param $longitudeA * @param $latitudeB * @param $longitudeB * @return float */ function getDistanceA ($latitudeA, $longitudeA, $latitudeB, $longitudeB) { // 将角度转为狐度 $radLat1 = deg2rad($latitudeA);// deg2rad()函数将角度转换为弧度 $radLat2 = deg2rad($latitudeB); $radLng1 = deg2rad($longitudeA); $radLng2 = deg2rad($longitudeB); $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137; //返回值距离单位:千米 return $s; } /** * php通过经纬度计算直线距离 方法二 * @param $latitudeA

根据经纬度和半径计算经纬度范围

余生颓废 提交于 2020-02-27 07:11:25
public class LatLonUtil { private static double PI = 3.14159265; private static double EARTH_RADIUS = 6378137; private static double RAD = Math.PI / 180.0; /// <summary> /// 根据提供的经度和纬度、以及半径,取得此半径内的最大最小经纬度 /// </summary> /// <param name="lat">纬度</param> /// <param name="lon">经度</param> /// <param name="raidus">半径(米)</param> /// <returns></returns> public static double[] GetAround(double lat, double lon, int raidus) { Double latitude = lat; Double longitude = lon; Double degree = (24901 * 1609) / 360.0; double raidusMile = raidus; Double dpmLat = 1 / degree; Double radiusLat = dpmLat *

地图两点间距离算法

风流意气都作罢 提交于 2020-02-17 20:30:53
原文地址: http://blog.chinaunix.net/space.php?uid=22363424&do=blog&cuid=2108521 2009-02-13 11:14:40 发表于 电子技术 本文链接: 通过经纬度计算距离的公式 在去年cosbeta曾经发布了一个 网页计算工具 ,这个作用就是根据地球上两点之间的经纬度计算两点之间的直线距离。经纬度到距离的计算在通信工程中应用比较广泛,所以cosbeta通过搜索找到了一个js的计算脚本(其实是google map的计算脚本,应该算是比较准确了),做成了 这个经纬度算距离的工具 。 今天有人给cosbeta发邮件,询问计算的公式是什么样的。其实,若是把地球当作一个正常的球体(其实它是椭球)来说,球面两点之间的距离计算并不复杂,运用球坐标很容易就能计算出两点之间的弧长。当然这都是高中的知识,我和你一样,也没有那个耐心来将其推导,所以我就利用google map的经纬度到距离计算的js脚本,将球面弧长的公式给还原出来(估计这个公式是经过部分修正的),还原出来的公式如下: 对上面的公式解释如下: 公式中经纬度均用弧度表示,角度到弧度的转化应该是很简单的了吧,若不会,依然请参考这个 这个经纬度算距离的工具 ; Lat1 Lung1 表示A点经纬度,Lat2 Lung2 表示B点经纬度; a=Lat1 – Lat2

MySQL经纬度距离查询

与世无争的帅哥 提交于 2020-02-05 20:14:02
在实际需求中,会有按某一坐标点查询其指定范围内的符合条件的数据,数据库中记录了数据的经纬度,在给出某一点位之后,需要我们动态计算其与其它信息的距离,然后筛选。 一个实例SQL如下: 注意:其中point字段类型为 point(mysql 5.6.1 增加了对空间数据支持功能,新增了st_*相关函数,可计算两个地理坐标点的距离) 参数:经度112.5590670000000000 纬度37.8021270000000000 (其它信息: AreaCode = '140213' distance<100000 结合实际情况进行追加) SELECT * FROM (SELECT name, Code, Address, Longitude, latitude, CONVERT(st_distance(point(112.5590670000000000, 37.8021270000000000), point) * 111195, DECIMAL(10, 2)) as distance FROM (SELECT Name, Address, Longitude, Latitude, point(Longitude, Latitude) point FROM lift WHERE AreaCode = '140213' AND Longitude != '0

PHP版根据经纬度和半径计算出经纬度的范围

穿精又带淫゛_ 提交于 2020-02-04 04:08:56
百度地图提供了范围搜索的功能,但是它使用的是百度自己的数据,但是有时候我们需要使用自己的数据,显示在地图上。比如给定两个参数:指定位置(某一处的经纬度lnglat)和搜索半径(r),搜索指定范围内的数据。针对这样的需求,基本有三种方法可以解决: 1:根据map提供的计算两个坐标之间距离的方法,逐一计算指定位置和我们DB库中的位置的距离s,用s和r进行比较,如果s<r,则在搜索范围内,返给前段标注在地图上。这种方法如果数据量小,可以尝试,如果数据量大,没测试过,但可以想象…… 2:使用搜索引擎自带的功能,比如solr的位置感知搜索,可参看文章http://www.ibm.com/developerworks/cn/java/j-spatial/ 3:如果对精度要求不是很高,可以根据指定位置的经纬度和半径计算出经纬度的范围,然后判断DB中的经纬度是否在此范围内,可用SQL进行查询。下面是此计算方法: /** * @param lat 纬度 lon 经度 raidus 单位米 * return minLat,minLng,maxLat,maxLng */ public function getAround($lat,$lon,$raidus){ $PI = 3.14159265; $latitude = $lat; $longitude = $lon; $degree = (24901