将具有多个值的字符串转换为双精度(PostgreSQL)

时间:2013-10-04 14:36:36

标签: sql postgresql postgis

也许有人能够指出我对以下问题的正确解决方案:

我有一个坐标为字符串的表,例如'9.94 54.839'(出于其他目的,我需要将坐标值保存在一列中)。对于PostGIS函数ST_GeomFromText,我需要它们作为双精度值。

示例:ST_GeomFromText('POINT(9.94 54.839)',4326)

另一个问题是坐标长度不同(例如:'9.873684 54.63'

4 个答案:

答案 0 :(得分:1)

正如函数名称所示,ST_GeomFromText需要更具体的文字well-known text。挑选双精度值是不必要的。您只需要使用连接运算符||

来粘合这些部分
SELECT ST_GeomFromText('POINT(' || meta_string_value || ')', 4326) AS geom
FROM (
    SELECT '9.94 54.839'::text AS meta_string_value
    UNION ALL SELECT '9.873684 54.63'::text AS meta_string_value
) AS t1;

答案 1 :(得分:1)

我回答了你的另一个(非常相似)的问题: Obtain double precision values from inconsitent strings for using ST_GeomFromText (PostGIS)答案是一样的。

回顾一下

According to the docsST_GeomFromText需要(text, integer),而非(double precision)

您需要做的只是CONCAT(),它应该有效。

解决方案

ST_GeomFromText(CONCAT('LINESTRING(', "YourTable"."YourString", ')'), 4326);

此外,如果您有多个值(点)需要连接以形成一条线(或多边形),请查看STRING_AGG(text, text)

答案 2 :(得分:0)

假设纬度经度(lat lon)的字符串“pos”。拆分字符串并将其转换为浮动,使用strip删除任何不需要的空格。

tmp = pos.split()
lat = float(tmp[0].strip())
lon = float(tmp[1].strip())

然后您可以执行以下操作:

latlonString = 'POINT(%f %f)' % (lat,lon)

在查询中使用变量:

ST_GeomFromText(latlonString,4326)

例如:

SELECT id
FROM features
WHERE pos = ST_GeomFromText(latlonString,4326)

对于多个坐标对的字符串; xyString =“x1 y1 x2 y2”注意!没有用逗号分隔:

xyString = '3.584731 60.739211 3.590472 60.738030 3.592740 60.736220'
xy = xyString.split()
tuples  = [i+' '+j for i,j in zip(xy[::2],xy[1::2])]
multiPointString = ','.join(map(str,tuples))
polygonString = 'POLYGON((%s))' % (multiPointString)
print polygonString

打印:

POLYGON((3.584731 60.739211,3.590472 60.738030,3.592740 60.736220))

如果你有一个像这样的多边形字符串:“x1 y1,x2 y2,....”,只需编辑一行:

xy = xyString.replace(",", " ").split()

如果您使用psycopg2作为postgresql适配器,这应该足够了。 也许它没有回答你所有的问题,但希望这会有所帮助。

答案 3 :(得分:-1)

通过提示,我可以使用以下语法获得点坐标:

    SELECT ST_GeomFromText(((('POINT('|| split_part(t1.meta_string_value, ' ', 1)::double
    precision) || ' ') || split_part(t1.meta_string_value, ' ', 2)::double precision) ||
    ')', 4326) AS geom FROM points t1

现在我遇到了一个新问题。在上面的情况下,只需要两个双精度值(LON,LAT)来创建坐标外的几何。如果我想从坐标列表中创建一条线或多边形,例如:

,我该怎么办?
    9.873684 54.63, 9.8432 54.8792, 9.032 54.32, 8.9 54.987

问题在于我不知道线或多边形有多少坐标......

关于它的任何想法?