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