postgresql - 从 postgis 中的查询插入表单

标签 postgresql postgis

我尝试通过查询在我的表 geofield 中插入一个多边形。表 geofield 定义如下:

CREATE TABLE geofield(id SERIAL PRIMARY KEY, field GEOMETRY);

insert into geofield(field) values (myfield)
SELECT
    'POLYGON(('||cast((select lat from coordinates where id=1)as varchar)||' '||
      cast((select lon from coordinates where id=1)as varchar)||','||
      cast((select lat from coordinates where id=2)as varchar)||' '||
      cast((select lon from coordinates where id=2)as varchar)||','||
      cast((select lat from coordinates where id=3)as varchar)||' '||
      cast((select lon from coordinates where id=3)as varchar)||','||
      cast((select lat from coordinates where id=4)as varchar)||' '||
      cast((select lon from coordinates where id=4)as varchar)||','||
      cast((select lat from coordinates where id=1)as varchar)||' '||
      cast((select lon from coordinates where id=1)as varchar)||'))') AS myfield;

SELECT 单独返回我:

POLYGON((46.744628268759314 6.569952920654968,46.74441692818192 6.570487107359068,46.74426116111054 6.570355867853787,46.74447250168793 6.569821681149689,46.744628268759314 6.569952920654968))

但它不起作用,我也尝试使用 ST_GeomFromText 但结果相同。

最佳答案

我会避免使用文本连接并使用普通的 PostGIS functions相反:

SELECT
    /* Make a polygon from the linestring */
    ST_MakePolygon(
        /* Close the polygon */
        ST_AddPoint(
            t.linestring,
            ST_StartPoint(t.linestring)
        )
    )
FROM (
    SELECT
        /* Aggregate into a linestring */
        ST_MakeLine(ST_MakePoint(c.lon, c.lat) ORDER BY c.id) AS linestring
    FROM coordinates AS c
) t
;

关注您的 prior question ,如果你愿意,你可以直接从 json 中取回它:

SELECT
    /* Make a polygon from the linestring */
    ST_MakePolygon(
        /* Close the polygon */
        ST_AddPoint(
            t.linestring,
            ST_StartPoint(t.linestring)
        )
    )
FROM (
    SELECT
        /* Aggregate into a linestring */
        ST_MakeLine(ST_MakePoint(c.lon, c.lat) ORDER BY c.id) AS linestring
    FROM
    (
        SELECT
            e.id,
            (e.element->>'lat')::numeric AS lat,
            (e.element->>'lon')::numeric AS lon
        FROM
            field AS f,
            json_array_elements(f.data->'vertices') WITH ORDINALITY AS e(element, id)
    ) AS c
) t
;

关于postgresql - 从 postgis 中的查询插入表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39201417/

相关文章:

postgresql - AWS RDS PostgreSQL 9.5.4 扩展 postgis_tiger_geocoder 缺少 Soundex?

java - 更新 "ERROR: column "的 sql 使用了“关系 "account"不存在”,即使它确实存在

json - 将查询结果转换为 hstore 时保留列名

java - 使用java api在postgres自定义类型字段中插入值

google-bigquery - 将 PostGis 几何转换为 BigQuery 地理

postgresql - PostGIS SQL 从一组具有不同 ID 的点生成单独的线段

maps - 生成密度/热图,如 SpatialKey

sql - 在 Postgres 上选择 Distinct(不区分大小写)

Postgresql:错误:列 "mayvar"不存在而 myvar 是一个变量

postgresql - 对一个表内的功能运行 ST_intersects 的最佳方法?