0

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

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

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

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

4

4 回答 4

1

正如函数名所暗示的,需要文本——更具体地说,是众所周知的文本。挑选出双精度值是不必要的。您只需要使用连接运算符将各个部分粘合在一起:ST_GeomFromText||

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;
于 2013-10-08T02:04:34.290 回答
1

我回答了你的另一个(非常相似的)问题: 从不一致的字符串中获取双精度值以使用 ST_GeomFromText (PostGIS),答案是一样的。

只是为了回顾

根据文档ST_GeomFromText需要(text, integer),而不是(double precision)

您需要做的就是CONCAT()它应该可以工作。

解决方案

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

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

于 2013-10-08T02:41:54.660 回答
0

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

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 适配器,这应该足够了。也许它不能回答你所有的问题,但希望这会有所帮助。

于 2013-10-07T11:39:48.790 回答
-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

问题是我不知道一条线或多边形会有多少坐标......

有什么想法吗?

于 2013-10-06T15:34:04.153 回答