Python Gdal Open -Schicht von BytesPython

Python-Programme
Anonymous
 Python Gdal Open -Schicht von Bytes

Post by Anonymous »

Ich muss eine Konvertierung aus einer FlatgeOBuf -Datei durchführen, die ich als Bytes von einer HTTP -Anfrage in eine Geojson -Datei gelesen habe. auf Festplatte . Ich kenne den vSimem-Mechanismus, aber ich kämpfe darum, dass es funktioniert ... was ich mir ausgedacht habe:

Code: Select all

def write_vsimem(mem_path: str, data: bytes) -> None:
vsi_file = gdal.VSIFOpenL(mem_path, "w")
size = len(data)
try:
gdal.VSIFWriteL(data, 1, size, vsi_file)
if gdal.VSIFCloseL(vsi_file) != 0:
raise RuntimeError(
f"Failed to close VSIMEM file '{mem_path}': {gdal.GetLastErrorMsg()}"
)
except Exception as e:
raise RuntimeError(f"Error writing to VSIMEM file '{mem_path}': {e}") from e

def convert_flatgeobuf_to_geojson(flatgeobuf_data: bytes, name: str) -> bytes:
driver = ogr.GetDriverByName("FlatGeobuf")
mem_path = f"/vsimem/{name}.fgb"
fgb_data = driver.CreateDataSource(mem_path)
if not fgb_data:
raise RuntimeError(f"Failed to open FlatGeobuf file '{name}' with VSIMEM.")
write_vsimem(mem_path, flatgeobuf_data)
# Check if the layer exists
if fgb_data.GetLayerCount() != 1:
raise ValueError(
f"Expected 1 layer in FlatGeobuf file '{name}', found {fgb_data.GetLayerCount()} layers."
)
# Get the layer and extract geojson
layer = fgb_data.GetLayer(0)
return layer_to_geojson(layer=layer)
Wenn ich dies ausführe, erhalte ich die folgenden Protokolle, die anscheinend das write_vsimem Teil funktioniert:

Code: Select all

Converting FlatGeoBuf of size: 5570849
Write VSIMEM: 5570816
< /code>
Aber dann erhalte ich den folgenden Fehler, was bedeutet, dass die von mir erstellte OGR -Datenquelle noch leer ist: < /p>
Failed to hydrate data: Expected 1 layer in FlatGeobuf file 'my_layer', found 0 layers.
< /code>
Ist mein Ziel überhaupt möglich zu erreichen? Was mache ich dann falsch? Oder sollte ich auf die Festplatte aufgeben und schreiben? CreatedataSource 
) und dann können Sie aus dem Speicher lesen:

Code: Select all

def convert_flatgeobuf_to_geojson(flatgeobuf_data: bytes, name: str) -> bytes:
mem_path = f"/vsimem/{name}.fgb"
write_vsimem(mem_path, flatgeobuf_data)
fgb_data = ogr.Open(mem_path)
if not fgb_data:
raise RuntimeError(f"Failed to open FlatGeobuf file '{name}' with VSIMEM.")
# Check if the layer exists
if fgb_data.GetLayerCount() != 1:
raise ValueError(
f"Expected 1 layer in FlatGeobuf file '{name}', found {fgb_data.GetLayerCount()} layers."
)
# Get the layer and extract geojson
layer = fgb_data.GetLayer(0)
return layer_to_geojson(layer=layer, layer_name=name)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post