2016-07-13 13 views
0

私はsqlalchemyとgeoalchemyを使用し、geojsonで結果を変換します。このような通常の方法で :cx_Oracle.Objets直列化可能ではないので、GeoJSONでSDO_GEOMTRYを変換する方法

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

は、それは不可能です! 私はこの1つのように別々の属性を通じてアクセスすることができます。

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

である私のprogramm:

#!/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:[email protected]: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) 

私はにGeoJSONで私cx_Oracle.Objectsのすべてを変換しますが、どのように? インターネットでは、関数sdo2geojsonはSQLデベロッパーではうまく機能しますが、もちろんこの関数はPythonでは解読されていません...

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

答えて

0

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

import cx_Oracle 
import json 

connection = cx_Oracle.Connection("user/[email protected]") 
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))) 
+0

このエラーメッセージが表示されます。** AttributeError: 'cx_Oracle.ObjectType'オブジェクトには 'iscollection'という属性はありません**。 SQL文の私の結果はcx_Oracle.OBJECTです。なにが問題ですか? typeObjを定義した理由は? ** AttributeError: 'cx_Oracle.Connection'オブジェクトに属性 'gettype'がありません。** – Moehre

+0

関数に関して、最初の部分(if.obj.type.iscollection)が機能していません。 2番目の部分は正常に動作します。私はこのような構造を持っています:**(Number、cx_Oracle.OBJECT、String)、(...)、... ... **このような構造体をGeoJSONでどのように変換できますか?番号 ":12、 "幾何"[3500983.087、5394211.455、473.82800000000003、3500 978.97、5394211.04、469.069、3500979.85、5394201.47、468.482、3500984.777、53942 02.055、474.192、3500983.087、5394211.455、473.82800000000003]、 "タイプ":屋根} – Moehre

+0

cx_Oracleの未リリース版を使用する必要があります。ソースをhttps://bitbucket.org/anthony_tuininga/cx_oracleから取得し、コンパイルします。その後、うまくいくはずです。 –

関連する問題