aydcyhr 发表于 2020-8-3 19:23

影长求经纬度

一个由影长和时间计算经纬度的py脚本,如果信息只有一张图片,只要有拍摄时间和阴影,参考这个小脚本,方便计算经纬度坐标,减少时区时间经纬度之间的换算过程
#!/usr/bin/env python
#-*-coding:utf-8-*-
#coding=UTF-8
#test version
import math

#参数变量
ns =180#纬度
ew = 360#经度
ns_z=0#直射纬度
ew_z=0#直射经度
jingducha =0#经度差
weiducha =0#纬度差
weidu_y=0
jingdu_y=0

date_m = input("请输入影子长度测量日期(月):")
date_d = input("请输入影子长度测量日期(日):")
sq_ew = int(input("请输入时区(东:1,西:2):"))
sq_ji = int(input("请输入时区数:"))
time_h = float(input("请输入影子测量时间(时):"))
time_m = float(input("请输入影子测量时间(分):"))
sun = float(input("请输入影子方向(时钟秒针数字表示指向):"))
long = float(input("请输入影子长度比值(影子长度/实际长度):"))

#时区换算
sq = 0
if sq_ew == 1:
    sq = sq_ji+12
    if sq == 24:
      sq = sq-24
if sq_ew == 2:
    sq = 12-sq_ji

#时间日期换算(东西12区为基准)
time = time_h*60 + time_m - sq*60
if time < 0:
    time = time + 1440
    date_d = int(date_d) -1
date = int(date_m)*30.5 + int(date_d)

#计算太阳直射经度
if time < 720:
    time = time+1440
ew = ((time-720)/1440)*360
#输出太阳直射经度
if ew<180:
    ew_z=180-ew
    print("太阳直射经度为:\n西经")
    print(ew_z)
if ew>=180:
    ew_z=ew-180
    print("太阳直射经度为:\n东经")
    print(ew_z)

#计算太阳直射纬度
if date < 83:
    date = date+365
date_bili=(date-83)/91.25
if date_bili<1:
    ns = 90 - date_bili*23.433333333333334
if 1<=date_bili<=3:
    ns = 90+(date_bili-2)*23.433333333333334
if date_bili>3:
    ns = 90 - (date_bili-4)*23.433333333333334
#输出太阳直射纬度
if ns>90:
    ns_z=ns-90
    print("太阳直射纬度为:\n南纬")
    print(ns_z)
if ns<=90:
    ns_z=90-ns
    print("太阳直射纬度为:\n北纬")
    print(ns_z)

#计算偏移夹角
jiajiao = 90 - math.degrees(math.atan(long))   #太阳夹角

#计算影子经纬度差
weiducha=math.cos(math.radians(sun*6))
jingducha=math.sin(math.radians(sun*6))

#计算影子经纬度
weidu = ns - weiducha
jingdu = ew + jingducha

#输出影子经纬度
if jingdu<=0:
    jingdu=jingdu+360
if jingdu>360:
    jingdu=jingdu-360
if jingdu<180:
    jingdu_y=180-jingdu
    print("影子所在经度为:\n西经")
    print(jingdu_y)
if jingdu>=180:
    jingdu_y=jingdu-180
    print("影子所在经度为:\n东经")
    print(jingdu_y)

if weidu<0:
    weidu=0-weidu
if weidu>180:
    weidu=180-(weidu-180)
if weidu>90:
    weidu_y=weidu-90
    print("影子所在纬度为:\n南纬")
    print(weidu_y)
if weidu<=90:
    weidu_y=90-weidu
    print("影子所在纬度为:\n北纬")
    print(weidu_y)

aydcyhr 发表于 2020-8-17 20:13

lindey 发表于 2020-8-17 12:47
# 收藏!
---



这个我来解释一下,变量名是真的懒得改了,写完一次不愿意再动的那种

封装函数我不太懂,是自己瞎学的,这段时间了解一下,多谢了

时区的问题我是通过日期加时间来解决的,比如冬至,赤道与太阳的夹角是确定的,那么加上时间和一个与太阳对应的相对坐标,那么是应该是可以确定下来当前时区的,需要进一步计算的是纬度,这个我是用了个三角函数来做的,准确度肯定不太行了,也就是看金蝉脱壳的时候想到的,六分仪看着挺厉害

lindey 发表于 2020-8-19 23:31

aydcyhr 发表于 2020-8-17 20:13
这个我来解释一下,变量名是真的懒得改了,写完一次不愿意再动的那种

封装函数我不太懂,是自己瞎学的 ...

感谢回复。
---

关于时区问题,虽然没有概念,但是觉得很有道理。不过代码中应未应用吧?【sq_ew】、【sq_ji】是输入量。。

列明 发表于 2020-8-3 20:49

变量命名不规范啊,一会拼音一会英语,看得很出戏啊。还是要感谢分享!

luzhiyao 发表于 2020-8-3 20:56

不打包一下?

aydcyhr 发表于 2020-8-8 18:51

luzhiyao 发表于 2020-8-3 20:56
不打包一下?

不打包了,直接复制自己运行就行

aydcyhr 发表于 2020-8-8 18:53

列明 发表于 2020-8-3 20:49
变量命名不规范啊,一会拼音一会英语,看得很出戏啊。还是要感谢分享!

写的时候我自己也懵,写好之后也懒得改变量名了

firefox1234 发表于 2020-8-8 19:41

按这个算法 快下山的时候 影子无限长?

aydcyhr 发表于 2020-8-8 21:42

firefox1234 发表于 2020-8-8 19:41
按这个算法 快下山的时候 影子无限长?

肯定是按照在水平面的投影了

firefox1234 发表于 2020-8-9 11:33

快下山的时候,夹角无限小,影子就是无限大

aydcyhr 发表于 2020-8-10 07:09

firefox1234 发表于 2020-8-9 11:33
快下山的时候,夹角无限小,影子就是无限大

所以输入的都是一个假的值,还怎么去要求结果{:1_904:}

lindey 发表于 2020-8-17 12:47

# 收藏!
---

这功能新奇,收藏之。

- 变量命名有点尬
- 未封装函数
- 变量多,图片的时区实际中应未知
页: [1] 2
查看完整版本: 影长求经纬度