【问题标题】:How to store POINTS(LANG, LAT) into geometry type column in PostGIS?如何将 POINTS(LANG, LAT) 存储到 PostGIS 中的几何类型列中?
【发布时间】:2026-01-25 08:00:01
【问题描述】:

我在 PostGIS 中创建了一个表 itapp_cities,用于存储城市数据。我添加了一个数据类型为geometry 的列location 来存储一个城市的longitudelatitude。当我运行以下 INSERT 查询时,我收到如下所示的错误。

INSERT查询:

INSERT INTO itapp_cities(city_id, city_name, city_code, state_id, location) 
  VALUES (DEFAULT,'Ada', 'ada-ok',37,POINT(34.774531000000003, -96.678344899999999)); 

表定义:

CREATE TABLE itapp_cities
(
  city_id bigserial NOT NULL,
  city_name character varying(100) NOT NULL,
  city_code character varying(5) NOT NULL DEFAULT ''::character varying,
  state_id bigint NOT NULL,
  location geometry,
  CONSTRAINT itapp_cities_pkey PRIMARY KEY (city_id),
  CONSTRAINT fk_states FOREIGN KEY (city_id)
      REFERENCES itapp_states (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE
)

错误:

ERROR:  column "location" is of type geometry but expression is of type point
LINE 2:   VALUES (DEFAULT,'Ada', 'ada-ok',37,POINT(34.77453100000000...
                                             ^
HINT:  You will need to rewrite or cast the expression.
********** Error **********

ERROR: column "location" is of type geometry but expression is of type point
SQL state: 42804

如何在此列中存储点值?我是 PostGIS 新手,请原谅我提出这个愚蠢的问题

【问题讨论】:

    标签: database postgresql types postgis


    【解决方案1】:

    您可以使用函数ST_MakePoint() 并将SRID (Spatial Reference System Identifier) 设置为ST_SetSRID()

    SELECT ST_SetSRID(ST_MakePoint(longitude, latitude),4326)
    

    或者在您输入文字值时,将字符串表示形式提供给ST_GeomFromText()

    SELECT ST_GeomFromText('SRID=4326;POINT(34.774531 -96.6783449)')
    

    关于 dba.SE 的相关答案以及更多详细信息和链接:

    【讨论】:

      【解决方案2】:

      试试这个 SQL 并将其与您的插入 sql 查询匹配

          INSERT INTO itapp_cities(city_id, city_name, slug, state_id, location) 
        VALUES (DEFAULT,'Ada', 'ada-ok',37,st_GeomFromText('POINT(34.774531000000003 -96.678344899999999)', 312));
      

      更多详情请通过link

      【讨论】:

        【解决方案3】:

        根据 postGIS 文档,您的原始插入很接近。只需在 POINT 表达式周围添加 '。

        INSERT INTO itapp_cities(city_id, city_name, city_code, state_id, location) 
          VALUES (DEFAULT,'Ada', 'ada-ok',37,'POINT(34.774531000000003, -96.678344899999999)'); 
        

        http://postgis.net/workshops/postgis-intro/geometries.html

        【讨论】:

          最近更新 更多