在数据库gps位置存储的最佳数据格式是什么:
38°57'33.804"
95°15'55.739"
我无法将其转换为其他格式。
DB:PozstgrSQL 9.4
答案 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;
但是为了这个目的,编写另一个在语法上更容易阅读的函数会更容易。