Healpy query_polygon returns 不正确的区域
Healpy query_polygon returns incorrect area
我正在使用 healpy.query_polygon 来查找对应于矩形 FOV 的像素索引。但是,返回的索引与我的输入不匹配——在 healpy space 中创建一个多边形,它比 FOV 大 ~100 倍(或 returns ~14000 像素而不是预期的 ~30 像素)。
query_disc 函数按我的预期工作,但是,这不是我想要使用的函数。
对应的输出:
Top(disc), bottom (polygon)
对于hp.query_disc:
disc_center = astropy.coordinates.spherical_to_cartesian(1, np.deg2rad(47.3901), np.deg2rad(319.6428))
#(<Quantity 0.5158909828269898>, <Quantity -0.4383926760027675>, <Quantity 0.7359812195055898>)
radius = 0.06208
qd = hp.query_disc(128,disc_center,radius)
#plotting
for ind in range(len(prob)):
if ind in qd:
prob[ind] = 1
else:
prob[ind] = 0
对于hp.query_polygon:
ra_poly, dec_poly = (array([ 48.51458308, 48.51458308, 46.20781856, 46.20781856]), array([ 317.00403838, 322.28167591, 317.11703852, 322.16867577]))
xyzpoly = astropy.coordinates.spherical_to_cartesian(1, np.deg2rad(dec_poly), np.deg2rad(ra_poly))
#xyzpoly = array([[ 0.48450204, 0.52400015, 0.50709248, 0.5465906 ],
[-0.45174162, -0.40526109, -0.47093848, -0.42445795],
[ 0.74912435, 0.74912435, 0.72185467, 0.72185467]])
qp = hp.query_polygon(128,xyzpoly)
#plotting
for ind in range(len(prob)):
if ind in qp:
prob[ind] = 1
else:
prob[ind] = 0
谁能解释一下这个差异?从各方面来看,我没有看到任何错误,除非顶点被错误地实现到函数中。
通过考虑 query_polygon
接受什么作为输入,您的问题很容易解决:它需要一个 (N, 3)
坐标数组,而不是 (3, N)
。您传递给它的值是一个 3 元组,每个元素有 4 个元素,它被转换成一个形状为 (3, 4)
的数组。不确定 query_polygon
对第四个分量做了什么(可能会忽略它),但否则它将匹配一个三角形(在球体上)。
解决方法很简单:先转置坐标数组。
>>> qp = hp.query_polygon(128, array(xyzpoly).T)
>>> len(qp)
36
您的示例代码有两个问题:
交换 RA 和 dec。 spherical_to_cartesian
会抱怨
交换 RA 的最后两个值。 Healpy 将崩溃 Python(!),并显示您的多边形不是凸面的消息(连接点,您会看到)。
另一个问题是您的多边形没有定义什么在里面,什么在外面。看起来 healpy 做了 "right" 的事情,并假设最小的区域是 "inside"。定义多边形 "other way around"(反转球坐标)会产生相同的结果。
我正在使用 healpy.query_polygon 来查找对应于矩形 FOV 的像素索引。但是,返回的索引与我的输入不匹配——在 healpy space 中创建一个多边形,它比 FOV 大 ~100 倍(或 returns ~14000 像素而不是预期的 ~30 像素)。
query_disc 函数按我的预期工作,但是,这不是我想要使用的函数。
对应的输出: Top(disc), bottom (polygon)
对于hp.query_disc:
disc_center = astropy.coordinates.spherical_to_cartesian(1, np.deg2rad(47.3901), np.deg2rad(319.6428))
#(<Quantity 0.5158909828269898>, <Quantity -0.4383926760027675>, <Quantity 0.7359812195055898>)
radius = 0.06208
qd = hp.query_disc(128,disc_center,radius)
#plotting
for ind in range(len(prob)):
if ind in qd:
prob[ind] = 1
else:
prob[ind] = 0
对于hp.query_polygon:
ra_poly, dec_poly = (array([ 48.51458308, 48.51458308, 46.20781856, 46.20781856]), array([ 317.00403838, 322.28167591, 317.11703852, 322.16867577]))
xyzpoly = astropy.coordinates.spherical_to_cartesian(1, np.deg2rad(dec_poly), np.deg2rad(ra_poly))
#xyzpoly = array([[ 0.48450204, 0.52400015, 0.50709248, 0.5465906 ],
[-0.45174162, -0.40526109, -0.47093848, -0.42445795],
[ 0.74912435, 0.74912435, 0.72185467, 0.72185467]])
qp = hp.query_polygon(128,xyzpoly)
#plotting
for ind in range(len(prob)):
if ind in qp:
prob[ind] = 1
else:
prob[ind] = 0
谁能解释一下这个差异?从各方面来看,我没有看到任何错误,除非顶点被错误地实现到函数中。
通过考虑 query_polygon
接受什么作为输入,您的问题很容易解决:它需要一个 (N, 3)
坐标数组,而不是 (3, N)
。您传递给它的值是一个 3 元组,每个元素有 4 个元素,它被转换成一个形状为 (3, 4)
的数组。不确定 query_polygon
对第四个分量做了什么(可能会忽略它),但否则它将匹配一个三角形(在球体上)。
解决方法很简单:先转置坐标数组。
>>> qp = hp.query_polygon(128, array(xyzpoly).T)
>>> len(qp)
36
您的示例代码有两个问题:
交换 RA 和 dec。
spherical_to_cartesian
会抱怨交换 RA 的最后两个值。 Healpy 将崩溃 Python(!),并显示您的多边形不是凸面的消息(连接点,您会看到)。
另一个问题是您的多边形没有定义什么在里面,什么在外面。看起来 healpy 做了 "right" 的事情,并假设最小的区域是 "inside"。定义多边形 "other way around"(反转球坐标)会产生相同的结果。