Deg Min Secs在数据库中

时间:2013-08-23 18:19:19

标签: database postgresql gps store

在数据库gps位置存储的最佳数据格式是什么:

38°57'33.804"
95°15'55.739"

我无法将其转换为其他格式。

DB:PozstgrSQL 9.4

6 个答案:

答案 0 :(得分:1)

你检查过PostGIS吗?这是为像这样的数据

答案 1 :(得分:1)

存储数据的最佳方式取决于完全您要对数据执行的操作。

例如,如果您要存储世界各地城镇的GPS坐标而只是想查找它们,那么您可以将其完全存储。在这种情况下,绝对没有必要操纵或比较数据。

但是,如果您想比较数据,例如查找附近的城镇,最好以一种允许这种比较的方式存储它。鉴于这些值是六十进制的(基数为60),可能最简单的方法是转换如下:

38°57'33.804" (38 degrees, 57 minutes, 33.804 seconds)
= (38 * 60 + 57) * 60 + 33) * 1000 + 804
= 140,253,804

对于最大范围-180..180,最终会得到一个值± 324,000,000,它很容易适合32位有符号整数。

答案 2 :(得分:0)

这取决于您想要对数据做什么。

如果您只想存储它,我建议使用varchar。使用每侧使用$$而不是单引号来转义字符串。

如果您想使用数据,可以创建自己的用户定义数据类型(UDT)。

答案 3 :(得分:0)

我的第一个想法是将位置存储为十进制度。

如果这是不可接受的并且您需要存储DMS,您可以将其存储为VARCHAR,或者甚至将其全部“转换”为十分之一秒,并将其存储为整数,这样就可以保持精度。

答案 4 :(得分:0)

最佳格式是
1)转换为十进制度:例如-73,123456
2)然后乘以1E7(10000000)
3)转换或舍入为整数

这是一个有符号的int,只需要4个字节,坐标粒度就在几毫米的范围内。

但这也取决于你的目标: 海量数据存储空间最小?见上文。

或通过查询可访问的数据:
然后我会使用Postgres为坐标

提供的格式

答案 5 :(得分:0)

这是我的建议。它有点笨重所以忍受我。您也可以在C中做得更好一些。但是这是一种基于SQL的方法。如果不采用基于C语言的方法,您将失去的是能够快速轻松地将其转换为特定输出格式的能力。

 CREATE TYPE degminsec AS (
       deg int,
       min int,
       sec numeric
 );
 CREATE OR REPLACE FUNCTION decdeg_to_degminsec(numeric) RETURNS degminsec 
 LANGUAGE SQL AS $$
    SELECT floor($1), 
           floor(($1 - floor($1)) * 60), 
           ($1 * 60 - floor($1 * 60)) * 60;
 $$;

 CREATE OR REPLACE FUNCTION display(degminsec) RETURNS text
 LANGUAGE SQL AS  $$
 SELECT $1.deg || '°' || $1.min || '''' || $1.sec || '"';
 $$;

这种方法的主要缺点是你会有一个索引有问题的类型,你必须在输出时转换它。除了btree索引之外的任何东西,这只是项目的开始。如果你不转换输出,而不是38°57'33.804“你会得到(38,57,33.804)

现在,您可能会认为这太麻烦了,但请注意,如果您继续存储小数点坐标,您仍然可以在出路时将其转换为显示格式,这可能会解决您的问题。有了上述内容,如果你不是一次格式化很多这些,你可以只是:

 SELECT display(decdeg_to_degminsec(mycoord)) from mytable;

但是为了这个目的,编写另一个在语法上更容易阅读的函数会更容易。