-1

長方形の FOV に対応するピクセル インデックスを見つけるために、healpy.query_polygon を使用しています。ただし、返されるインデックスは入力と一致しません。FOV よりも ~100 倍大きい (または、予想される ~30 ピクセルではなく ~14000 ピクセルを返す) ポリゴンを healpy 空間に作成します。

query_disc 関数は期待どおりに機能しますが、これは私が使用しようとしている関数ではありません。

対応する出力: 上(ディスク)、下(ポリゴン)

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

誰もこの不一致を説明できますか? すべてのアカウントで、頂点が関数に正しく実装されていない限り、エラーは表示されません。

4

1 に答える 1

0

あなたの問題はquery_polygon、入力として受け入れるものを考慮することで簡単に解決できます.(N, 3)ではなく、座標の配列が必要(3, N)です. 渡す値は、それぞれ 4 つの要素の 3 タプルであり、 shape の配列に変換され(3, 4)ます。4 番目のコンポーネントがどうなるかはわかりませんquery_polygonが (おそらく無視されます)、それ以外の場合は (球上の) 三角形に一致します。

解決策は簡単です。最初に座標配列を転置します。

>>> qp = hp.query_polygon(128, array(xyzpoly).T)
>>> len(qp)
36

サンプル コードには 2 つの問題があります。

  • RAとdecを交換します。spherical_to_cartesian文句を言います

  • RA の最後の 2 つの値を交換します。Healpy は Python(!) をクラッシュさせ、ポリゴンが凸状ではないというメッセージが表示されます (ドットを接続すると表示されます)。

追加の問題は、ポリゴンが内側と外側を定義していないことです。ヘルピーは「正しい」ことをしているように見え、最小の領域が「内側」であると想定しています。多角形を「逆」(球面座標を逆) に定義しても、同じ結果が得られます。

于 2016-06-14T05:21:36.550 に答える