工作原因要用vba编写一个批量生成kml圆的代码,在网上找了很久资料很少,好不容易找到一个还是一直在讲理论,看的晕头转向不说,最后的代码还不是用VB写的,更是看不懂,只能自己想办法了,写出解题过程和代码,供大家参考。
首先在谷歌地球上画一个圆,用txt或excel打开,发现任意一个圆都是由72个不重叠的在圆周上等距的点组成的,因此只需确定这72个点就能画出圆了。画圆时圆心经纬度和半径是已知的。再观察一下这个圆,圆上有四个点是特殊的,点1(J1,W1),点2(J2,W2),点3(J3,W3),点4(J4,W4),点1和点2的经度与圆心的经度相同,点3和点4的纬度和圆心的纬度相同,如下图:

重点一:同一经度上纬度相差1度,距离相差111195米,设此值为L,因为圆心经纬度(J0,W0)和半径R都是已知的,所以可以算出上下两个特殊点的经纬度,即点1(J0,W0+R/L),点2(J0,W0-R/L)。
重点二:坐标距离公式,在网上可以找到已知两个点经度,求两点的距离公式,如下图:

我们把距离公式中A点看做是圆心,B点看做是圆周上的任意点,那么距离就是已知的R,把公式复制出来,等号左边用R表示如下:
R=6371004*ACOS((SIN(RADIANS(B2))*SIN(RADIANS(D2))+COS(RADIANS(B2))COS(RADIANS(D2))COS(RADIANS(C2-A2))))
重点二,观察上面的距离公式可以发现C2只出现了一次,也就是假设D2为已知时,通过将上面的公式转换,可以等到求C2的一个等式,如下:
C2 = Acos((Cos(R / 6371004) - Sin(Radians(B2)) * Sin(Radians(D2))) / (Cos(Radians(B2)) * Cos(Radians(D2)))) * 57.3 + A2
因此,当知道圆周上任意一点的纬度时,就可以算出他的经度,也就确定了这个点。
重点三,圆周上任意点的纬度怎么算,开始时就说到了,我们要在圆周上取等距的72个点,也就是这72个点与圆心相连形成的夹角为5度,为方便理解以任意一点为例进行解释,如下图(为方便观察5度角画的大了些):

画出待求点所在纬线,因为任意纬线都和任意经线垂直,所有此线与圆心所在经线垂直,这样就形成了一个直角三角形,通过直角三角形相关公式可以求得L1= R Cos(5),然后得到L2=R-L1,再通过上面说到的重点一(纬度差与距离的关系),得到待求点的纬度为W0-R Cos(5)/L,再通过重点二说到的距离公式变化出的公式可以得到待求点的经度,综上,圆周上任意一点的经纬度都能求出来了。
在求圆周任意点纬度的时候还需要根据点在圆周不同位置的情况稍微做一些公式调整,不过整体思路是不变的,就不具体说明了。
在编写vb代码的时候cos和sin要注意角度和弧度的转换。
下面是根据上面的思路用VB写的求圆周72点的自定义函数代码,三个参数分别为圆心经度,圆心纬度,半径,返回值为连续的72个经纬度,可以直接放到生成面的kml文件经纬度位置来生成圆。代码写的不好,见笑
在我的资源里有写好的宏文件,可以批量生成点线面圆,可以自定义生成对象的属性如颜色、透明度、图钉样式,在谷歌地球上点击生成的对象可以显示对象的属性卡片,并且这些属性可以自定义,生成的图层最多可以分成三层文件夹,需要的可以下载。

Function 圆周经纬(x, y, r)
Dim j2, w2 '圆周点经纬度
Dim ws, wx '圆最上、最下纬度
Dim jiaodu, hudu
Dim arc
Dim ii '循环变量
Dim wr '纬度间距
Dim yjw, yjw1wr = 111195 '相同经度上,每相差1纬度时相差的距离,米
arc = 6371229   '米
'r1 = r * Cos(5) '角度的邻边=斜边*cos角度
'r1 = r * Sin(5) '角度的对边=斜边*sin角度ws = y + r / wr
wx = y - r / wr'从圆最下偏右6度逆时针,间隔5度'1度经纬度
w2 = wx + (r - r * Cos(Application.WorksheetFunction.Radians(1))) / wr
j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + x
yjw = j2 & "," & w2For ii = 1 To 17w2 = wx + (r - r * Cos(Application.WorksheetFunction.Radians(5 * ii + 1))) / wr '邻边,cos和sin内是弧度制j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + xyjw = yjw & " " & j2 & "," & w2
Next'从圆最右侧偏上逆时针'1度经纬度
w2 = y + (r * Sin(Application.WorksheetFunction.Radians(1))) / wr
j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + x
yjw = yjw & " " & j2 & "," & w2For ii = 1 To 17w2 = y + (r * Sin(Application.WorksheetFunction.Radians(5 * ii + 1))) / wr  '对角边j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + xyjw = yjw & " " & j2 & "," & w2
Next'从圆最上侧偏左逆时针'1度经纬度
w2 = ws - (r - r * Cos(Application.WorksheetFunction.Radians(1))) / wr
j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + x
j2 = 2 * x - j2
yjw = yjw & " " & j2 & "," & w2For ii = 1 To 17w2 = ws - (r - r * Cos(Application.WorksheetFunction.Radians(5 * ii + 1))) / wr '邻边j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + xj2 = 2 * x - j2yjw = yjw & " " & j2 & "," & w2
Next'从圆最左侧偏下逆时针'1度经纬度
w2 = y - (r * Sin(Application.WorksheetFunction.Radians(1))) / wr
j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + x
j2 = 2 * x - j2
yjw = yjw & " " & j2 & "," & w2For ii = 1 To 17w2 = y - (r * Sin(Application.WorksheetFunction.Radians(5 * ii + 1))) / wr '对角边j2 = Application.WorksheetFunction.Acos((Cos(r / 6371004) - Sin(Application.WorksheetFunction.Radians(y)) * Sin(Application.WorksheetFunction.Radians(w2))) / (Cos(Application.WorksheetFunction.Radians(y)) * Cos(Application.WorksheetFunction.Radians(w2)))) * 57.3 + xj2 = 2 * x - j2yjw = yjw & " " & j2 & "," & w2
Next
圆周经纬 = yjw
End Function

vba编写kml圆思路相关推荐

  1. 用VBA编写的简易计算器

    我用EXCEL2010的VBA编写了一个简易计算器,代码很简单,核心内容是如何计算字符串表达式(例如"3+2*5"),JAVAscript.Python中可以使用EVAL()函数, ...

  2. 编写一个圆类Circle

    编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...

  3. 使用html编写SVG圆图形,CSS vs. SVG:任意图形UI组件

    在这个系列教程的前两篇文章中,我们比较了CSS和SVG创建图形文本.复选框和单选按钮的技术与效果.在这篇文章中将介绍CSS和SVG对比技术中的另一个技术--创建图形UI组件的技术. 具体地说,我们将要 ...

  4. java编写交通灯思路

    总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制.右转弯的4条路线的控制灯假设称为常绿状态,另外,其他的8条路线是两两成对的,可以归为4组,所以,程序只用考虑垂直行走状态 ...

  5. 关于使用hexo搭建博客并实现实时编写markdown的思路

    这里只是提供一个思路 我这边使用的是阿里云主机跑的hexo hexo在80端口使用,域名绑定主机并备案(国内主机需备案) 使用的就是:hexo s --debug -p 80 关于后端的文章编写使用的 ...

  6. java编写定义圆类和圆柱体类,Java程序基础编程基础

    1.在屏幕上输出"你好" //Programmer name Helloword.java public class Helloword { public static void ...

  7. 【测试】编写测试用例的思路和方法

    文章目录 1)什么是测试用例? 1.1 测试用例的定义 测试用例的内容: *为什么需要测试用例? 测试用例的作用: 1.2 测试用例的元素 测试目标(Why): 测试对象(What): 测试环境(Wh ...

  8. Excel VBA编写excel数据汇总宏命令

    一.概述 最近刚好有需求,就研究了下VBA编程,使用excel的宏命令编写了一个数据汇总小工具,汇总指定目录下的所有excel文件seet1的数据至一个新的excel表中,设计思想如下: 1.将要汇总 ...

  9. 游戏外挂的编写原理和思路

    游戏外挂的编写原理(一) 一. 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作.修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩 ...

最新文章

  1. 为什么说++i的效率比i++高?
  2. 获取项目文件在服务器的真实路径
  3. JAVA相关基础知识(一)
  4. Description Resource Path Location Type Java compiler level does not match the version of the instal
  5. 如何在电脑中使用python_教你怎么在windows上用python获得CPU信息
  6. 【JAVA】数据结构——堆的排序及相关面试题
  7. C-V2X国内现状分析
  8. ubuntu安装最新的chrome浏览器
  9. PLC远程监控与数据采集方案
  10. Python爬取笔趣阁小说,有趣又实用!
  11. Packet Tracer 思科模拟器入门教程 之十三 路由器OSPF动态路由配置
  12. 微一案做php,微一案:真正的高效率,都是这么炼成的
  13. 2022-iOS个人开发者账号申请流程
  14. 【Parsec + ZeroTier】校园网内免费远程桌面(支持游戏)
  15. 项目沟通管理流程的6大规范步骤
  16. 工单状态的几个TABLE
  17. iPhone上Siri无法正常回应如何解决?
  18. mldonkey安装
  19. zscore标准化步骤_z-score的标准化究竟怎么弄?
  20. Hanselman的精彩事事通讯:2014年9月5日

热门文章

  1. 张嘉佳《云边有个小卖部》| 希望和悲伤,都是一缕光
  2. python实现将数据写入Excel文件中
  3. zoj 3353 Chess Board 高斯消元
  4. 菏泽中考报名不报计算机,菏泽中考报名系统
  5. 小白使用LaTeX排版笔记
  6. Edxposed安装和xposed框架在Android 8.0以上手机使用最全攻略
  7. 什么牌子的台灯对孩子的视力好?618好用性价比高的护眼台灯
  8. 我用 Python 抓取《大秦赋》“相关数据”,发现了这些秘密......
  9. python 正则 replace函数_python pandas中的str对象的replace函数
  10. 2021年春季学期期末统一考试 中国法制史 试题