首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的json格式保存到geoalchemy2几何字段中

正确的json格式保存到geoalchemy2几何字段中
EN

Stack Overflow用户
提问于 2014-06-04 09:41:27
回答 2查看 1.3K关注 0票数 3

我有一个json的格式:

代码语言:javascript
复制
{

     "type":"Feature",
     "properties":{},
     "geometry":{
          "type":"Point",
          "coordinates":[6.74285888671875,-3.6778915094650726]
     }
}

和一个瓶-地球化学2定义的领域如下:-

代码语言:javascript
复制
from app import db
from app.mixins import TimestampMixin
from geoalchemy2 import Geometry

class Event(db.Model, TimestampMixin):
    __tablename__ = 'events'

    id = db.Column(db.BigInteger, primary_key=True)
    title = db.Column(db.Unicode(255))
    start = db.Column(db.DateTime(timezone=True))
    location = db.Column(Geometry(geometry_type='POINT', srid=4326))
    is_active = db.Column(db.Boolean(), default=False)

    def __repr__(self):
        return '<Event %r %r>' % (self.id, self.title)

试图保存带有上面json值分配的event对象的event.location时,如果出现此错误,则失败

代码语言:javascript
复制
DataError: (DataError) Geometry SRID (0) does not match column SRID (4326)

event.location的正确格式是什么?

代码语言:javascript
复制
db.session.add(event)
db.session.commit() 

才能正常工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-16 07:16:40

这是我处理地理信息时的一个错误。我需要显式地声明geojson必须遵守的srid

这就是解决办法:-

代码语言:javascript
复制
def process_formdata(self, valuelist):
    """ Convert GeoJSON to DB object """
    if valuelist:
        geo_ob = geojson.loads(valuelist[0])
        # Convert the Feature into a Shapely geometry and then to GeoAlchemy2 object
        # We could do something with the properties of the Feature here...
        self.data = from_shape(asShape(geo_ob.geometry), srid=4326)
    else:
        self.data = None
票数 0
EN

Stack Overflow用户

发布于 2020-09-13 22:12:54

我最后使用了以下代码段:在加载/保存数据时使用GeoJSON值的列类型:

代码语言:javascript
复制
class GeometryJSON(Geometry):
    """ Geometry, as JSON

    The original Geometry class uses strings and transforms them using PostGIS functions:
        ST_GeomFromEWKT('SRID=4269;POINT(-71.064544 42.28787)');

    This class replaces the function with nice GeoJSON objects:
        {"type": "Point", "coordinates": [1, 1]}
    """
    from_text = 'ST_GeomFromGeoJSON'
    as_binary = 'ST_AsGeoJSON'
    ElementType = dict

    def result_processor(self, dialect, coltype):
        # Postgres will give us JSON, thanks to `ST_AsGeoJSON()`. We just return it.
        def process(value):
            return value
        return process

    def bind_expression(self, bindvalue):
        return func.ST_SetSRID(super().bind_expression(bindvalue), self.srid)

    def bind_processor(self, dialect):
        # Dump incoming values as JSON
        def process(bindvalue):
            if bindvalue is None:
                return None
            else:
                return json.dumps(bindvalue)
        return process

    @property
    def python_type(self):
        return dict
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24034007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档