【问题标题】:How to insert a Geometry with geoalchemy2 and postgresql如何使用 geoalchemy2 和 postgresql 插入几何
【发布时间】:2020-11-04 20:37:51
【问题描述】:

我正在尝试将几何数据插入数据库,但它不起作用。我为 Geometry 创建了一个模型类,但如果它是正确的,我现在不这样做。

几何类:

from datetime import datetime

from sqlalchemy import and_
from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy import DateTime
from sqlalchemy import Float
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from sqlalchemy import SMALLINT
from sqlalchemy import BIGINT
from sqlalchemy import String
from sqlalchemy import DateTime
from geoalchemy2 import Geometry as Geom
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Geometry(Base):
    __tablename__ = "geometry"

    id = Column(Integer, primary_key=True)
    fill_color = Column(String(7))
    stroke_color = Column(String(7))
    geom = Column(Geom(geometry_type=None)) # here my Geometry column 
    type = Column(String(20))
    area = Column(BIGINT, nullable=False)
    lengh = Column(BIGINT, nullable=False)
    creation_date = Column(DateTime, nullable=False)
    stroke_width = Column(SMALLINT, nullable=False)
    tn = Column(Integer, nullable=False)
    vegetation_index = Column(Integer)

插入代码:

for index, line in data[['Shape_Area', 'Shape_Leng', 'TN', 
  'geometry']].iterrows():
  geometry = line['geometry']
  area = line['Shape_Area']
  lengh = line['Shape_Leng']
  tn = line['TN']
  now = datetime.now()
  
  geom = Geometry(geom='POLYGON((0 0,1 0,1 1,0 1,0 0))', 
    type=geometry.type, area=area, lengh=lengh, creation_date=now, tn=tn)

self._session.add(geom)
self._session.commit()

错误:

sqlalchemy.exc.ProgrammingError

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedFunction) function st_geomfromewkt(unknown) does not exist
LINE 1: ..._width, tn, vegetation_index) VALUES (NULL, NULL, ST_GeomFro...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

[SQL: INSERT INTO geometry (fill_color, stroke_color, geom, type, area, lengh, creation_date, stroke_width, tn, vegetation_index) VALUES (%(fill_color)s, %(stroke_color)s, ST_GeomFromEWKT(%(geom)s), %(type)s, %(area)s, %(lengh)s, %(creation_date)s, %(stroke_width)s, %(tn)s, %(vegetation_index)s) RETURNING geometry.id]
[parameters: {'fill_color': None, 'stroke_color': None, 'geom': 'POLYGON((0 0,1 0,1 1,0 1,0 0))', 'type': 'MultiPolygon', 'area': 699322.6710989687, 'lengh': 3855.587947253079, 'creation_date': datetime.datetime(2020, 11, 4, 17, 25, 37, 943407), 'stroke_width': None, 'tn': '000.000', 'vegetation_index': None}]
(Background on this error at: http://sqlalche.me/e/13/f405)

我想包含任何类型的几何图形,而不仅仅是多边形

【问题讨论】:

    标签: python python-3.x postgresql geoalchemy2 geoalchemy


    【解决方案1】:

    几何是列类型,换个名字试试

    class myTableWithGeom(Base):
    
    __tablename__ = "myTableWithGeom"
    
    id = Column(Integer, primary_key=True)
    fill_color = Column(String(7))
    stroke_color = Column(String(7))
    geom = Column(Geometry(geometry_type='POLYGON')) # here your Geometry column 
    type = Column(String(20))
    area = Column(BIGINT, nullable=False)
    lengh = Column(BIGINT, nullable=False)
    creation_date = Column(DateTime, nullable=False)
    stroke_width = Column(SMALLINT, nullable=False)
    tn = Column(Integer, nullable=False)
    vegetation_index = Column(Integer)
    
    geom_test = myTableWithGeom()
    

    这里不需要实例化一个 Geometry 对象,直接做

    geom_test.geom = 'POLYGON((0 0,1 0,1 1,0 1,0 0))' 
    

    然后你可以添加和提交

    self._session.add(geom)
    self._session.commit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 2019-07-03
      • 2012-12-22
      • 2021-11-20
      相关资源
      最近更新 更多