Oh ok geht das wirklich so einfach?
Wenn ich dein Code ausprobiere kommt folgende Fehlermeldung:
ORA-21500: Interner Fehlercode, Argumente: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]
Nur wenn ich die Geometrie weglasse funktioniert es wieder.
In der Python Konsole:
>>> geometry.SDO_ORDINATES
<cx_Oracle.Object MDSYS.SDO_ORDINATE_ARRAY at 0x2533de8>
>>> geometry.SDO_ORDINATES.aslist()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
cx_Oracle.DatabaseError: OCI-21500: Interner Fehlercode, Argumente: [19708], [],
[], [], [], [], [], []
OCI-21500: Interner Fehlercode, Argumente: [kope2upic2954], [54], [155], [0], []
, [], [], []
OCI-21500: Interner Fehlercode, Argumente: [19708], [], [], [], [], [], [], []
Was bedeutet das???
Wie erstelle ich ein JSON in SQLAlchemy?
Ok ich weiß jetzt wo der Fehler liegt!
In der cx_Oracle Doku steht, dass das Cursor Object eine default Größe von 50 (cursor.arraysize) besitzt!
Das heißt er greift nur 50 Reihen von der Abfrage ab und überträgt sie zum Client.
Wenn ich die arraysize vom Cursor erhöhe werden alle Ergebnisse dargestellt.
Dieser Internal Server Error bezieht sich somit auf die Cursor.arraysize!
Wenn ich alternativ diesen code verwenden will kommt bei Geometrie null raus. Wisst ihr vielleicht wieso?:
In der cx_Oracle Doku steht, dass das Cursor Object eine default Größe von 50 (cursor.arraysize) besitzt!
Das heißt er greift nur 50 Reihen von der Abfrage ab und überträgt sie zum Client.
Wenn ich die arraysize vom Cursor erhöhe werden alle Ergebnisse dargestellt.
Dieser Internal Server Error bezieht sich somit auf die Cursor.arraysize!
Code: Alles auswählen
class grid:
def GET(self):
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
web.header('Content-Type', 'application/json')
cursor = connection.cursor()
cursor.arraysize = 5000 # default = 50
cursor.execute("""SELECT a.id , c.geometry, d.Classname FROM building a, THEMATIC_SURFACE b, SURFACE_GEOMETRY c, OBJECTCLASS d WHERE a.grid_id_400 = 4148 AND a.id = b.BUILDING_ID AND b.LOD2_MULTI_SURFACE_ID = c.ROOT_ID AND c.GEOMETRY IS NOT NULL AND b.OBJECTCLASS_ID = d.ID""")
result = []
for id, geometry, classname in cursor:
result.append({
"building_nr": id, "geometry": {
"type": "polygon",
"coordinates": geometry.SDO_ORDINATES.aslist(),
}, "polygon_typ": classname,
})
return json.dumps(result)
Code: Alles auswählen
def GeometryObj(obj):
coordinates = []
sourceCoordinates = obj.SDO_ORDINATES.aslist()
for i in range(len(sourceCoordinates) // 3):
coordinates.append(sourceCoordinates[i * 3:i * 3 + 3])
return
Code: Alles auswählen
result = []
for id, geometry, classname in cursor:
result.append({
"building_nr": id, "geometry": {
"type": "polygon",
"coordinates": GeometryObj(geometry),
}, "polygon_typ": classname,
})
return json.dumps(result)
Ahh ich habe vergessen beim return coordinates anzugeben!
So jetzt funktioniert es optimal....
Output:
[{"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496994.34, 5394340.43, 440.82500000000005], [3496994.18, 5394336.51, 440.92], [3496998.89, 5394336.19, 440.68800000000005], [3496999.1, 5394339.13, 440.612], [3496997.82, 5394339.22, 440.675], [3496997.89, 5394340.19, 440.65000000000003], [3496994.34, 5394340.43, 440.82500000000005]]}, "polygon_typ": "BuildingRoofSurface"},
{"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496999.1, 5394339.13, 440.612], [3496998.89, 5394336.19, 440.68800000000005], [3496998.89, 5394336.19, 438.27], [3496999.1, 5394339.13, 438.27], [3496999.1, 5394339.13, 440.612]]}, "polygon_typ": "BuildingWallSurface"}, {"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496997.82, 5394339.22, 440.675], [3496999.1, 5394339.13, 440.612], [3496999.1, 5394339.13, 438.27], [3496997.82, 5394339.22, 438.27], [3496997.82, 5394339.22, 440.675]]}, "polygon_typ": "BuildingWallSurface"}]
So jetzt funktioniert es optimal....
Output:
[{"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496994.34, 5394340.43, 440.82500000000005], [3496994.18, 5394336.51, 440.92], [3496998.89, 5394336.19, 440.68800000000005], [3496999.1, 5394339.13, 440.612], [3496997.82, 5394339.22, 440.675], [3496997.89, 5394340.19, 440.65000000000003], [3496994.34, 5394340.43, 440.82500000000005]]}, "polygon_typ": "BuildingRoofSurface"},
{"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496999.1, 5394339.13, 440.612], [3496998.89, 5394336.19, 440.68800000000005], [3496998.89, 5394336.19, 438.27], [3496999.1, 5394339.13, 438.27], [3496999.1, 5394339.13, 440.612]]}, "polygon_typ": "BuildingWallSurface"}, {"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496997.82, 5394339.22, 440.675], [3496999.1, 5394339.13, 440.612], [3496999.1, 5394339.13, 438.27], [3496997.82, 5394339.22, 438.27], [3496997.82, 5394339.22, 440.675]]}, "polygon_typ": "BuildingWallSurface"}]
@moehre: schau mal Dein "return" an.
Code: Alles auswählen
def geometry_to_points(obj):
return zip(*[iter(obj.SDO_ORDINATES.aslist())]*3)