上知天文,下晓地理!

黑洞刷屏已经持续了好多天,黑洞照片并不是大家所认为的拍出来的,而是通过望远镜阵列采集的数据并使用一定的算法进行合成的。既然要实现算法必然离不开代码,对于数据分析以及数据可视化做的最好的也就是 Python 了,但是仅仅使用 Python 的数据分析以及数据可视化的模块或者包远远不够,天文学的东西太多了,如果一个一个自定义根本不切实际,于是有人想到要把这些天文学的东西封装起来,然后就出现了即将要讲解的 Python 模块——astropy。天文地理,与之对应的还有一个地理学的模块(我之前用过)——geopy。今天就来重点介绍这两个模块!

01

上知天文

我们首先来看一下模块 astropy,astropy 是一个社区的针对天文学的 Python 库。

astropy 包包含关键的功能和用 Python 进行天文学和天体物理学研究的工具。

数据结构和转换

常量(astropy.constants)

astropy.constants 包含大量的在天文学研究很有用的物理常量。常量是 带有额外的用于描述可能性和不确定性的元数据的 Quantity(astropy.units.Quantity)对象。下面我们来看一个例子。

from astropy import constants as const
print(const.c)
print('---------------------------------------------------------------------------------------------------------------')
print(const.c.to('km/s'))

运行结果如图所示。

第一个输出像一个字典,key = value 的形式,第二个输出就是一个数带上一个单位。看了输出结果大家应该都知道常量 c 是光在真空中的速度了吧~!其实物理学常量还有很多,下面给出表。

Name

Value

Unit

Description

G

6.67408e-11

m3 / (kg s2)

万有引力常量

N_A

6.02214086e+23

1 / (mol)

阿伏伽德罗常数

R

8.3144598

J / (K mol)

气体常量

Ryd

10973731.6

1 / (m)

里德博常数

a0

5.29177211e-11

m

波尔半径

alpha

0.00729735257

精细结构常数

atm

101325

Pa

标准大气压

b_wien

0.0028977729

m K

Wien波长位移定律常数

c

299792458

m / (s)

光在真空的速度

e

1.60217662e-19

C

一个电子的带电量

eps0

8.85418782e-12

F/m

电常数

g0

9.80665

m / s2

标准重力加速度

h

6.62607004e-34

J s

普朗克常数

hbar

1.0545718e-34

J s

约化普朗克常数

k_B

1.38064852e-23

J / (K)

玻尔兹曼常数

m_e

9.10938356e-31

kg

电子质量

m_n

1.67492747e-27

kg

中子质量

m_p

1.6726219e-27

kg

质子质量

mu0

1.25663706e-06

N/A2

磁常数

muB

9.27400999e-24

J/T

波尔磁子

sigma_T

6.65245872e-29

m2

汤姆森散射截面面积

sigma_sb

5.670367e-08

W / (K4 m2)

斯忒藩-玻尔兹曼常数

u

1.66053904e-27

kg

原子质量

GM_earth

3.986004e+14

m3 / (s2)

地球质量和引力常数的积

GM_jup

1.2668653e+17

m3 / (s2)

木星质量和引力常数的积

GM_sun

1.3271244e+20

m3 / (s2)

太阳质量和引力常数的积

L_bol0

3.0128e+28

W

绝对的波米星等为0的光度

L_sun

3.828e+26

W

太阳光度

M_earth

5.97236473e+24

kg

地球质量

M_jup

1.89818717e+27

kg

木星质量

M_sun

1.98847542e+30

kg

太阳质量

R_earth

6378100

m

地球赤道半径

R_jup

71492000

m

木星赤道半径

R_sun

695700000

m

太阳半径

au

1.49597871e+11

m

地球与太阳之间的平均距离

kpc

3.08567758e+19

m

千秒差距

pc

3.08567758e+16

m

秒差距

单位和数量(astropy.units)

astropy.units 处理定义,互相转换和进行带有物理单位的计算。它也可以处理对数的单位。

astropy.units 不能处理球面几何学和六十进制(小时,分钟,秒)的单位转换,如果想要处理天体坐标,去看 astropy.coordinates 模块。

大多数 astropy.units 的使用者会伴随着使用 quantities:一个值和一个单位的组合。创建 Quantity 最简单的方式是使用一个数乘或者除内置的单位。对标量矢量都有效,矢量可以用序列表示,也可以用 numpy 数组表示。

from astropy import units as u
import numpy as np
print(42.0*u.meter)
print('---------------------------------------------------------------------------------------------------------------')
print([1., 2., 3.]*u.m)
print('---------------------------------------------------------------------------------------------------------------')
print(np.array([1., 2., 3.])*u.m)
print('---------------------------------------------------------------------------------------------------------------')
# 你也可以从一个 Quantity 中用成员变量来获取单位和值
q = 42.0*u.meter
print(q.value)
print('---------------------------------------------------------------------------------------------------------------')
print(q.unit)
print('---------------------------------------------------------------------------------------------------------------')
# 从这个简单的组成部分来看,伴随着不同的单位进行数量的组合是很简单的
print(15.1*u.meter/(32.0*u.second))
print('---------------------------------------------------------------------------------------------------------------')
print(3.0*u.kilometer/(130.51*u.meter/u.second))
print('---------------------------------------------------------------------------------------------------------------')
print((3.0*u.kilometer/(130.51*u.meter/u.second)).decompose())
print('---------------------------------------------------------------------------------------------------------------')
# 单位转换可以使用 to()方法来完成,这个方法返回一个对应单位的新的 Quantity 对象
x = 1.0*u.parsec
print(x.to(u.km))
print('---------------------------------------------------------------------------------------------------------------')

数据结构和转换的东西太多了,常量、单位和数量只是其中一部分,在这里面还有 N 维数据集(astropy.nddata),数据表(astropy.table),时间日期(astropy.time),天体坐标系统(astropy.coordinates),世界坐标系统(astropy.wcs),模型和适应(astropy.modeling),不确定性和分布(astropy.uncertainty)。

astropy 不仅仅只有数据结构和转换,还有文件、输入输出和通信,计算和实用工具……

因为能力限制和篇幅限制我就不讲了,下面开始讲解与 astropy 对应的模块 geopy。

02

下晓地理

现在我们看一下地理学模块 geopy,geopy 让 Python 开发者可以使用第三方地理编码器和数据源,轻松定位全球的坐标(只能精确到镇)。

geopy 包括 OpenStreetMap Nominatim,Google Geocoding API (V3),以及许多其他的地理编码服务的类。

地理编码器

你可能会使用的每一种地理位置服务,诸如 Google Maps,Bing Maps,或者 Nominatim,在 geopy.geocoders 都有它们自己的类来抽象服务的应用程序接口。每一个地理编码器都至少定义了一个为了从一个字符串中解析出位置的 geocode 方法,并且还有可能定义一个用于将坐标转换为地址的 reverse 方法。每一个地理编码器在初始化的过程中接受任何需要和它的服务有交互的证书和设置,比如一个应用程序接口密钥或者一个地址。

from geopy.geocoders import Nominatim
print('地理定位一个查询产生一个地址和坐标:')
geolocator = Nominatim(user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                                  'Chrome/63.0.3239.132 Safari/537.36', timeout=10)
location = geolocator.geocode("175 5th Avenue NYC")
print(location.address)
print((location.latitude, location.longitude))
print(location.raw)
print('查找对应坐标的地址:')
geolocator = Nominatim(user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                                  'Chrome/63.0.3239.132 Safari/537.36', timeout=10)
location = geolocator.reverse("52.509669, 13.376294")
print(location.address)
print((location.latitude, location.longitude))
print(location.raw)

计算距离

geopy 伴随着函数 geopy.distance.distance 中可用的测地线距离的默认值,可以通过使用测地线距离或者大圆距离计算出地球上两点之间的测地线距离。

大圆距离将地球的模型看成一个球体,利用国际大地测量学和地球物理学联合会所定义的平均地球半径,约为 6371.009km,最多产生 0.5%的误差。半径的值被存在变量 distance.EARTH_RADIUS,所以它支持自定义(但是单位永远是 km)。

测地线距离是在地球的椭球模型的表面的最短距离,默认算法是使用 Karney 在 2013 年提出的方法 geodesic。

geopy.distance.distance 当前使用 geodesic。

有许多流行的椭球模型,使用哪一个最准确取决于你两个点在地球上的位置,默认使用总体最精确的 WGS-84椭球模型。

from geopy import distance
newport_ri = (41.49008, -71.312796)
cleveland_oh = (41.499498, -81.695391)
print(distance.distance(newport_ri, cleveland_oh).miles)
wellington = (-41.32, 174.81)
salamanca = (40.96, -5.50)
print(distance.distance(wellington, salamanca).km)

geopy 不仅仅只有地理编码器和计算距离,还有数据、异常、日志……

原文发布于微信公众号 - 小陈学Python(gh_a29b1ed16571)

原文发表时间:2019-04-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券