使用sql查询360度环绕

gt0wga4j  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(436)

我对使用sql相当陌生,我想学习如何有效地过滤天空区域的黄道坐标(经度、纬度)数据集。数据集位于南黄道半球(从-90到0和0到360),如下所示(用python模拟,使用一些简单的numpy-arange命令)。

我已经通过以下代码了解了如何在python中过滤特定的天空补丁:

x = (eclong + 360 - center) % 360
ind = x > 180
x[ind] = x[ind] - 360 #converts from 0 to 360 to -180 to +180
x = -x #reverses scale where east direction is on left

为了让数据点环绕南极,我还有一个额外的必要条件:

filtered_eclong = (x < 12/np.cos(eclat *np.pi/180)) & (-12/np.cos(eclat *np.pi/180) < x & eclat < 0)

12度是我想要抓取的那片天空有多宽,中心是我想要的那片天空的黄道经度的一个变量。查询中的最后一行是一个修正,以包括南黄道极点附近的物体(注:eclat=黄道纬度,eclong=黄道经度,两者都以度为单位)作为我想要得到的结果的一个例子,我想要过滤的天空区域以315.8度的黄道经度为中心,如下所示:

我将整个模拟的南半球保存为csv文件,并将eclong和eclat值作为列上传到sql数据库中。我希望能够重新创建我在上面的python代码中执行的查询。这是我最近的一次尝试:

select * from coords
    where eclat < -6
    and mod(abs(eclong-315.8+360),360)-360 < 180
    and mod(abs(eclong-315.8),360) < 12/cos(radians(eclat));

它生成这样的结果,其中过滤的python结果显示为红色,过滤的sql结果显示为蓝色:

如图所示,我的查询不包含从360度到0度的东西,我不太确定如何包含那些缺失的点。
我认为结合使用then、else或case语句会有所帮助:

select * from Catalog
where eclat < -6
CASE
    WHEN mod(abs(eclong-315.8),360) < 12/cos(radians(eclat)) > 0 THEN 'I'm not sure what to do...'
    WHEN mod(abs(eclong-315.8),360) < 12/cos(radians(eclat)) < 360 THEN 'I'm not sure what to do...'
into myDB.filename

有sqlMaven吗?

new9mtju

new9mtju1#

虽然我不熟悉黄道坐标,但听起来你是在试图调和基于头衔的负数的缺乏。如果这真的是你想要的,谁在乎没有任何负面的价值,让我们假装有!
总而言之,我们需要确保我们可以安全地计算±距任何起始经度180度。在这个用例中,从11度开始,我们可以通过从大于的任何值中减去360来重新排列无用的值 11 + 180 作为助手处理结果。这样,359度就会显示为-1,然后你就可以做普通的数学了。如果你的起始经度在180以上,我们需要得到360以上的最低值。在sql中,以下是一种创建helper列的方法(可能效率低下,但很简单):

CASE
    WHEN center < 180 THEN CASE
                               WHEN eclong > center + 180 THEN eclong - 360
                               ELSE eclong
                           END
    WHEN center > 180 THEN CASE
                               WHEN eclong < center - 180 THEN eclong + 360
                               ELSE eclong
                           END
    ELSE eclong
END as friendly_eclong

相关问题