使用GPS经纬度定位附近地点(某一点范围内查询)

数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545)

最初想法,以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作),上网百度类似的文章有了点眉目

大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了 经纬度是一个点,半径是一个距离,不能直接加减

代码如下:


/// <summary>
    /// 经纬度坐标
    /// </summary>    

  public class Degree
    {
        public Degree(double x, double y)
        {
            X = x;
            Y = y;
        }
        private double x;

        public double X
        {
            get { return x; }
            set { x = value; }
        }
        private double y;

        public double Y
        {
            get { return y; }
            set { y = value; }
        }
    }

    public class CoordDispose
    {
        private const double EARTH_RADIUS = 6378137.0;//地球半径(米)

        /// <summary>
        /// 角度数转换为弧度公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double radians(double d)
        {
            return d * Math.PI / 180.0;
        }

        /// <summary>
        /// 弧度转换为角度数公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double degrees(double d)
        {
            return d * (180 / Math.PI);
        }

        /// <summary>
        /// 计算两个经纬度之间的直接距离
        /// </summary>

        public static double GetDistance(Degree Degree1, Degree Degree2)
        {
            double radLat1 = radians(Degree1.X);
            double radLat2 = radians(Degree2.X);
            double a = radLat1 - radLat2;
            double b = radians(Degree1.Y) - radians(Degree2.Y);

            double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
             Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
            s = s * EARTH_RADIUS;
            s = Math.Round(s * 10000) / 10000;
            return s;
        }

        /// <summary>
        /// 计算两个经纬度之间的直接距离(google 算法)
        /// </summary>
        public static double GetDistanceGoogle(Degree Degree1, Degree Degree2)
        {
            double radLat1 = radians(Degree1.X);
            double radLng1 = radians(Degree1.Y);
            double radLat2 = radians(Degree2.X);
            double radLng2 = radians(Degree2.Y);

            double s = Math.Acos(Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Cos(radLng1 - radLng2) + Math.Sin(radLat1) * Math.Sin(radLat2));
            s = s * EARTH_RADIUS;
            s = Math.Round(s * 10000) / 10000;
            return s;
        }

        /// <summary>
        /// 以一个经纬度为中心计算出四个顶点
        /// </summary>
        /// <param name="distance">半径(米)</param>
        /// <returns></returns>
        public static Degree[] GetDegreeCoordinates(Degree Degree1, double distance)
        {
            double dlng = 2 * Math.Asin(Math.Sin(distance / (2 * EARTH_RADIUS)) / Math.Cos(Degree1.X));
            dlng = degrees(dlng);//一定转换成角度数  原PHP文章这个地方说的不清楚根本不正确 后来lz又查了很多资料终于搞定了

            double dlat = distance / EARTH_RADIUS;
            dlat = degrees(dlat);//一定转换成角度数

            return new Degree[] { new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-top
                                  new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-bottom
                                  new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y + dlng,6)),//right-top
                                  new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y + dlng,6)) //right-bottom
            };

        }
    }

测试方法:

代码如下:


static void Main(string[] args)
        {
            double a = CoordDispose.GetDistance(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));//116.416984,39.944959
            double b = CoordDispose.GetDistanceGoogle(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));
            Degree[] dd = CoordDispose.GetDegreeCoordinates(new Degree(116.412007, 39.947545), 102);
            Console.WriteLine(a+" "+b);
            Console.WriteLine(dd[0].X + "," + dd[0].Y );
            Console.WriteLine(dd[3].X + "," + dd[3].Y);
            Console.ReadLine();
        }

试了很多次 误差在1米左右

拿到圆的顶点就好办了

数据库要是sql 2008的可以直接进行空间索引经纬度字段,这样应该性能更好(没有试过)

lz公司数据库还老 2005的 这也没关系,关键是经纬度拆分计算,这个就不用说了 网上多的是 最后上个实现的sql语句

代码如下:


SELECT id,zuobiao FROM dbo.zuobiao WHERE zuobiao<>'' AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)>116.41021 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)<116.413804 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',2)<39.949369 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',2)>39.945721
时间: 2024-09-28 11:48:01

使用GPS经纬度定位附近地点(某一点范围内查询)的相关文章

android通过gps获取定位的位置数据和gps经纬度 _Android

复制代码 代码如下: package com.action.android_test;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.

android通过gps获取定位的位置数据和gps经纬度

复制代码 代码如下:package com.action.android_test;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.w

api 地图 定位-C#窗体如何加载地图,然后根据经纬度定位?

问题描述 C#窗体如何加载地图,然后根据经纬度定位? C#窗体右边加载地图(不用browse控件和图片框),怎么加载? 地图右边是datagridview控件用于显示位置(经纬度)信息,点击其中一行根据读取到的位置信息,在地图上定位,类似于网页地图上的标杆定位或显示红色块状点状区域,请问如何做到? 解决方案 http://blog.csdn.net/kkkkkxiaofei/article/details/8663377

根据经纬度定位省份(直辖市)、地市

问题描述 现在有这样一个需求,需要根据客户端的地理经纬度坐标信息定位到所在城市,精确到地级市.我首先想到的是调用百度地图等第三方接口,简单又方便,但是这样做在高并发的情况下并不可靠,且接口调用有频率限制,boss要求我把这个做成公司的基础服务,还推荐了google的s2-geometry-library几何库,将地图上的区域划分成各种级别的格子,感觉不好做.有大神做过根据经纬度定位城市吗?求指点! 解决方案 解决方案二:我知道百度是有的.解决方案三:你们公司有实力做GIS吗?还是老老实实用第三方

极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位

0×00 前言 GNSS是Global Navigation Satellite System的缩写.中文称作:全球卫星导航系统.全球导航卫星系统.   GNSS泛指所有的卫星导航系统,包括全球的.区域的和增强的,如美国的GPS.俄罗斯的Glonass.欧洲的Galileo.中国的北斗卫星导航系统,以及相关的增强系统,如美国的WAAS(广域增强系统).欧洲的EGNOS(欧洲静地导航重叠系统)和日本的MSAS(多功能运输卫星增强系统)等,还涵盖在建和以后要建设的其他卫星导航系统. 0×01 摘要

ext-怎么用EXT实现一点按钮将查询的信息显示在新页面上.然后将新页面上的内容打印出来?

问题描述 怎么用EXT实现一点按钮将查询的信息显示在新页面上.然后将新页面上的内容打印出来? 怎么实现一点按钮将查询的信息显示在新页面上.然后将新页面上的内容打印出来?没学习过EXT,现在改代码太吃力了...

信息安全市场的领跑者,凭借聚焦服务器的业务定位和“外防黑客、内治内鬼”的绝技

互联网的生态逻辑其实和非洲草原并没有本质区别:狮子总想抓住羚羊,而羚羊也在想如何逃过狮子的追捕--无论是狮子还是羚羊,它们醒来的第一件事就是奔跑! 互联网世界中,黑客与用户的关系就是狮子与羚羊,你追我跑,不知不觉中,二者已经跑得很远,并在无意中进步. "进步是不是只能源自这种一追一赶的状态,是否还有其他的可能性?"杭州安恒信息技术有限公司总裁范渊在7年前问了自己这样的问题,从那之后他开始寻找答案. 互联网的守护者 2005年,第一次参加美国黑帽子(BLACKHAT)安全大会之后,留学海

如何解决Android GPS没法定位的问题

大家去网上搜索Android定位location为null没法定位问题,估计有一大堆文章介绍如何来解决,但是最后大家发现基本没用.本文将从Android定位实现原理来深入分析没法定位原因并提出真正的解决方案.在分析之前,我们肯定得先看看android官方提供的定位SDK. 默认Android GPS定位实例 获取LocationManager: mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVI

如何利用arcgis engine在地图中进行经纬度定位

问题描述 经纬度在数据库中,那么怎么实现定位呢,并标注点 解决方案 解决方案二:同问已解决方案了请给我一份(540931017qq.com)谢谢解决方案三:你们俩估计连SDK长什么样子都不知道吧解决方案四:也想知道!!!