在此处输入标题

声明变量

  1. //假设当前坐标
  2. double lon1 = 113.336028;
  3. double lat1 = 23.21745;
  4. //距离m
  5. double distance = 1000 * 5;
  6. private static double EARTH_RADIUS = 6378137;//赤道半径(单位m)

主要方法[LantitudeLongitudeDist]

  1. public static double LantitudeLongitudeDist(double lon1, double lat1, double lon2, double lat2)
  2. {
  3. double radLat1 = rad(lat1);
  4. double radLat2 = rad(lat2);
  5. double radLon1 = rad(lon1);
  6. double radLon2 = rad(lon2);
  7. if (radLat1 < 0)
  8. radLat1 = Math.PI / 2 + Math.Abs(radLat1);// south
  9. if (radLat1 > 0)
  10. radLat1 = Math.PI / 2 - Math.Abs(radLat1);// north
  11. if (radLon1 < 0)
  12. radLon1 = Math.PI * 2 - Math.Abs(radLon1);// west
  13. if (radLat2 < 0)
  14. radLat2 = Math.PI / 2 + Math.Abs(radLat2);// south
  15. if (radLat2 > 0)
  16. radLat2 = Math.PI / 2 - Math.Abs(radLat2);// north
  17. if (radLon2 < 0)
  18. radLon2 = Math.PI * 2 - Math.Abs(radLon2);// west
  19. double x1 = EARTH_RADIUS * Math.Cos(radLon1) * Math.Sin(radLat1);
  20. double y1 = EARTH_RADIUS * Math.Sin(radLon1) * Math.Sin(radLat1);
  21. double z1 = EARTH_RADIUS * Math.Cos(radLat1);
  22. double x2 = EARTH_RADIUS * Math.Cos(radLon2) * Math.Sin(radLat2);
  23. double y2 = EARTH_RADIUS * Math.Sin(radLon2) * Math.Sin(radLat2);
  24. double z2 = EARTH_RADIUS * Math.Cos(radLat2);
  25. double d = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
  26. //余弦定理求夹角
  27. double theta = Math.Acos((EARTH_RADIUS * EARTH_RADIUS + EARTH_RADIUS * EARTH_RADIUS - d * d) / (2 * EARTH_RADIUS * EARTH_RADIUS));
  28. double dist = theta * EARTH_RADIUS;
  29. return dist;
  30. }

遍历判断,得到符合条件的门店

  1. //准备存储符合条件门店的泛型类
  2. List<ShopPlaceInfo> placelist = new List<ShopPlaceInfo>();
  3. //查询数据库的门店地址坐标
  4. DataTable PlaceDt = kis_web.DBHelper.GetTable("select shopName, shopadress, Lat as lat,Lng as lon from Shop where Lat is not null and Lng is not null");
  5. foreach (DataRow item in PlaceDt.Rows)
  6. {
  7. double currLon = Convert.ToDouble(item["lon"]);
  8. double currLat = Convert.ToDouble(item["lat"]);
  9. double place = LantitudeLongitudeDist(lon1, lat1, currLon, currLat);
  10. //如果当前距离和该门店距离相差小于指定N公里
  11. if (place <= distance)
  12. {
  13. //放进符合条件门店的泛型类中
  14. placelist.Add(new ShopPlaceInfo()
  15. {
  16. lat = currLat,
  17. lon = currLon,
  18. saleQty = 1,
  19. saleAmount = 100,
  20. distance = place,
  21. shopName = item["shopName"].ToString()
  22. });
  23. }
  24. }
  25. //这样最终得到了符合条件的门店Json数据
  26. string reJson = JsonConvert.SerializeObject(placelist);

参考文章地址

该参考地址里面的文章是用Java写的,我这里使用的这个方法转成了C#的

这是一个小系列,还有后续

2019/9/18后续补充

  1. private static double rad(double d)
  2. {
  3. return d * Math.PI / 180.0;
  4. }

【地图功能开发系列:一】根据当前坐标点获取距离不超过N公里的门店的更多相关文章

  1. 【地图功能开发系列:二】根据地址名称通过百度地图API查询出坐标

    根据地址名称通过百度地图API查询出坐标 百度地图ApiUrl string url = "http://api.map.baidu.com/geocoder?address={0}& ...

  2. S5PV210开发系列四_uCGUI的移植

    S5PV210开发系列四 uCGUI的移植 象棋小子          1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...

  3. 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计

    这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...

  4. 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动

    在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...

  5. openlayers4 入门开发系列之小区信号扇形图篇

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  6. openlayers4 入门开发系列之地图模态层篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  7. openlayers4 入门开发系列之地图工具栏篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  8. openlayers4 入门开发系列之地图导航控件篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  9. 炸弹人游戏开发系列(7):加入敌人,使用A*算法寻路

    前言 上文中我们实现了炸弹人与墙的碰撞检测,以及设置移动步长来解决发现的问题.本文会加入1个AI敌人,敌人使用A*算法追踪炸弹人. 本文目的 加入敌人,追踪炸弹人 本文主要内容 开发策略 加入敌人 实 ...

随机推荐

  1. javascript小记三则:ASP.NET启动web调试,窗体自动放大的方法

    源码如下,简单一句JS,轻松解决窗体不会自动放大的浏览器: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  2. Eclipse4JavaEE配置Tomcat运行环境

    如果我们想搭一个网站,我们可以使用Eclipse for JavaEE IDE进行开发. 初次使用需要配置网站的运行环境,可以去Apache官网下载Tomcat 8.5或Tomcat 9的版本 然后打 ...

  3. 编程心法 之 怎么选择合适的IDE

    一般情况下,使用IDE进行开发可以极大的提高开发效率 最佳选择 如果语言是GNU开源的则Eclipse,因为Eclipse就是开源的 例如C和C++这样的底层语言并且经典的语言,基于GNU的语言,推荐 ...

  4. 【译】.NET 跨平台界面框架和为什么你首先要考虑再三

    现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...

  5. ThinkPHP 5.0/5.1 自定义404界面的配置

    ★ 背景还要啥背景,就是觉得不可能用框架自带的 404 界面呗.可能跟之前的版本配置方法有点区别,在此做一下简单的笔记 框架:ThinkPHP 5.1,ThinkPHP5.0.20 ★ 配置过程♩. ...

  6. Android常用的四种布局(或者说是五种)

    一.FrameLayout(帧布局): 显示特点:所有的子控件默认显示在FrameLayout的左上角,会重叠在一起显示. 常用属性: layout_gravity(设置给子控件,调整控件在容器内的重 ...

  7. Python笔记-IO编程

    IO在计算机中是指input和output(数据输入与输出),涉及到数据交换(磁盘.网络)的地方就需要IO接口. 输入流input stream是指数据从外面(磁盘.网络服务器)流入内存:输出流out ...

  8. 什么是Docker,它可干什么?

    定义我们知道,软件依赖的环境大致包括: 1• 配置文件2• 代码3• tomcat4• JDK5• 操作系统 Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包 ...

  9. delphi中WMI的使用(网卡是否接入)

    WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远程计算机. 通过使用W ...

  10. 定义工作,解读自我——IT帮2019年2月线下活动回顾

    本次活动是在北京和深圳两个分站同步进行的,IT团建委员会负责策划和组织,北京站由帮主周老师.王兵老师主导,深圳站由副帮主兼深圳站长陈焕老师主导. 几位老师都是有着丰富的工作经历和人生体验的导师,他们不 ...