过滤给定范围内的坐标

时间:2015-07-08 10:50:36

标签: python bash coordinates

我有数百个带有地理位置的.out文件,我将批量导入到SQLite数据库中。但是,为了节省时间,我只会在某些间隔内导入具有地理坐标的线。

文件是这样的:

value;value;longitude;latitude;value;value
value;value;longitude;latitude;value;value

因此,应该从文件中删除不在几个纬度内的所有内容以及经度间隔。

for f in *.out
do
for each line in $f:
    if not longitude >= longitude1 and longitude <= longitude2 
    or longitude >= longitude3 and longitude <= longitude4 or
    longitude>=longitude5 and longitude<=4:
         delete line

我已经包含了一个伪代码以显示一些功能,但是我如何在Bash,awk,python中执行此操作,或者哪种方法最快。

经度和纬度是这里的第三和第四个值。我有21个纬度区间,f.ex 69.41到70.95(纬度)。

示例输入

63;543534;34,12;59,43;22,80;654,324;139543;
63;25725;5,11;59,43;22,80;36,00;1391212800;
61;5382189;3,66;60,93;68,00;158,00;1391212800;
43;25977000;10,72;67,51;170,70;168,00;1391212800;
61;2000;4,54;60,00;352,50;352,00;1391212800;
53;2504210;6,96;62,89;289,40;511,00;1391212800;
27;2594800;22,35;70,24;14,50;98,00;1391212800;
61;257900;5,13;60,13;321,10;195,00;1391212800;
31;2598;18,76;69,56;230,20;235,00;1391212800;
63;44000;5,84;59,01;226,90;227,00;1391212800;
61;0;4,96;60,57;125,50;129,00;1391212800;
57;2575000;4,88;61,77;113,00;276,00;1391212800;
34;258500;16,58;69,70;18,20;201,00;1391212800;
243;217000;7,18;65,25;283,00;145,00;1391212800;
243;21900;7,20;64,97;44,80;109,00;1391212800;
243;2190516;2,44;58,20;270,50;121,00;1391212800;
243;22000;1,94;58,39;305,20;130,00;1391212800;
243;231067000;1,87;58,09;12,00;122,00;1391212800;
243;311000150;3,54;61,13;166,30;332,00;1391212800;
243;257282000;7,21;64,97;267,10;112,00;1391212800;
243;232758000;1,77;61,43;333,30;337,00;1391212800;
27;231711000;22,42;70,27;99,20;99,00;1391212800;
68;231770000;10,06;58,74;5,40;10,00;1391212800;

纬度间隔为69.41至70.95的所需输出:

27;2594800;22,35;70,24;14,50;98,00;1391212800;
31;2598;18,76;69,56;230,20;235,00;1391212800;
34;258500;16,58;69,70;18,20;201,00;1391212800;
27;231711000;22,42;70,27;99,20;99,00;1391212800;

请注意,最好将其写入新文件或覆盖现有文件。

1 个答案:

答案 0 :(得分:6)

如果您只有一个间隔要检查,请传递它们并进行比较:

awk -v lat=5 -v min_lat=69.41 -v max_lat=70.95 '
        BEGIN {FS=OFS=";"} 
        {sub(",",".",$lat)} 
        $lat>=min_lat && $lat<=max_lat' file

使用lat我指示纬度列,因为它在编辑中发生了变化。另请注意,字段中有逗号分隔小数,因此我用点替换它们。

测试

$ awk -v lat=5 -v min_lat=69.41 -v max_lat=70.95 'BEGIN {FS=OFS=";"} {sub(",",".",$lat)} $lat>=min_lat && $lat<=max_lat' file
27;1;2594800;22,35;70.24;14,50;98,00;1391212800;
31;3;2598;18,76;69.56;230,20;235,00;1391212800;
34;3;258500;16,58;69.70;18,20;201,00;1391212800;
27;1;231711000;22,42;70.27;99,20;99,00;1391212800;

如果碰巧有很多最小值和最大值,请将它们作为字符串传递并切片,以便检查它们是否在数组中:

awk -v lat=4 -v min="69.41 70.39" -v max="70.95 70.86" '
       BEGIN {FS=OFS=";"; n=split(min,minlat," "); m=split(max,maxlat," ")} 
       {sub(",",".",$lat); 
        for (i=1;i<=n;i++)  {
             if ($lat>=minlat[i] && $lat<=maxlat[i])
               {print; next}
        }
       }' file

这将间隔读入数组minlat[]maxlat[],然后将纬度与所有对(minlat[1], maxlat[1]), (minlat[2], maxlat[2]), ...进行比较。如果匹配,它会打印记录并跳到下一个记录,以防止多次打印。

测试

$ awk -v lat=4 -v min="69.41 70.39" -v max="70.95 70.86" 'BEGIN {FS=OFS=";"; n=split(min,minlat," "); m=split(max,maxlat," ")} {sub(",",".",$lat); for (i=1;i<=n;i++) {if ($lat>=minlat[i] && $lat<=maxlat[i]) {print; next}}}' file
27;2594800;22,35;70.24;14,50;98,00;1391212800;
31;2598;18,76;69.56;230,20;235,00;1391212800;
34;258500;16,58;69.70;18,20;201,00;1391212800;
27;231711000;22,42;70.27;99,20;99,00;1391212800;