1

私は sqlalchemy と geoalchemy を使用しており、結果を geojson に変換します。このような通常の方法で:

print json.dumps([dict(r) for r in connection.execute(query)])

cx_Oracle.Objets はシリアル化できないため、これは不可能です。次のような個別の属性を介してアクセスできます。

result = connection.execute(query)
result2 = result.fetchone()[0]
print result2.SDO_ORDINATES

これが私のプログラムです:

#!/usr/bin/env python
# coding: utf8
#from __future__ import absolute_import, division, print_function
from sqlalchemy import create_engine
from sqlalchemy import Table, MetaData
from sqlalchemy.sql import and_, select
from geoalchemy import Geometry, GeometryExtensionColumn
from geoalchemy import *
from geoalchemy.oracle import oracle_functions
from geoalchemy.oracle import OracleComparator
import cx_Oracle
import json
import sdo

#def main():
engine = create_engine('oracle+cx_oracle://TEST_3D:limo1013@10.40.33.160:1521/sdetest')
metadata = MetaData(engine)

# Loading tables 
building = Table(
    'building',
    metadata,
    GeometryExtensionColumn('centroid_geom', Geometry(2, srid= 431467)),
    autoload=True,
    autoload_with=engine
)
GeometryDDL(building)

thematic_surface = Table('thematic_surface', metadata, autoload=True)
surface_geometry = Table('surface_geometry', metadata, autoload=True)
objectclass = Table('objectclass', metadata, autoload=True)

connection = engine.connect()

# define the query
query = select([(surface_geometry.c.geometry)]  #building.c.id, surface_geometry.c.geometry, objectclass.c.classname
).where(
    and_(
        building.c.grid_id_400 == 4158,
        building.c.id == thematic_surface.c.building_id,
        thematic_surface.c.lod2_multi_surface_id == surface_geometry.c.root_id,
        surface_geometry.c.geometry != None,
        thematic_surface.c.objectclass_id == objectclass.c.id,
    )
)
# Execute and print the result of the query
#print json.dumps([dict(r) for r in connection.execute(query)])
result = connection.execute(query)

すべての cx_Oracle.Objects を GeoJSON に変換しますが、どのようにしますか? インターネットでは、SQL開発者で正常に動作する関数sdo2geojsonですが、もちろん、この関数はpythonでは不明です...

誰かが私を助けてくれることを願っています???

4

1 に答える 1

1

これは、オブジェクトのバインディングやその他のより高度なオブジェクトの使用をサポートする cx_Oracle の (まだリリースされていない) バージョンを使用しています。ジオメトリの挿入を示すために cx_Oracle で提供されるサンプルを使用して、次のコードはその方法で作成されたオブジェクトを JSON に変換します。以下に含まれる ObjectRepr() 関数は、Oracle から返されたすべてのオブジェクトに対して機能するはずです。オブジェクトのメタデータを読み取り、オブジェクトを属性の辞書または値のリストに変換するだけです。

import cx_Oracle
import json

connection = cx_Oracle.Connection("user/pw@tns")
typeObj = connection.gettype("SDO_GEOMETRY")
cursor = connection.cursor()
cursor.execute("""
        select Geometry
        from TestGeometry
        where IntCol = 1""")
obj, = cursor.fetchone()

def ObjectRepr(obj):
    if obj.type.iscollection:
        returnValue = []
        for value in obj.aslist():
            if isinstance(value, cx_Oracle.Object):
                value = ObjectRepr(value)
            returnValue.append(value)
    else:
        returnValue = {}
        for attr in obj.type.attributes:
            value = getattr(obj, attr.name)
            if value is None:
                continue
            elif isinstance(value, cx_Oracle.Object):
                value = ObjectRepr(value)
            returnValue[attr.name] = value
    return returnValue

print("JSON:", json.dumps(ObjectRepr(obj)))
于 2016-07-15T15:45:47.167 に答える