Mam prostą ramkę danych GeoPandas:
Chciałbym załadować tę GeoDataframe do tabeli PostGIS. Mam już konfigurację bazy danych z rozszerzeniem PostGIS, ale wydaje się, że nie mogę dodać tej ramki danych jako tabeli.
Próbowałem następujące:
engine = <>
meta = MetaData(engine)
eld_test = Table('eld_test', meta, Column('id', Integer, primary_key=True), Column('key_comb_drvr', Text),
Column('geometry', Geometry('Point', srid=4326)))
eld_test.create(engine)
conn = engine.connect()
conn.execute(eld_test.insert(), df.to_dict('records'))
Odpowiedzi:
Za pomocą metody to_sql Pandy i SQLAlchemy możesz przechowywać ramkę danych w Postgres. A ponieważ przechowujesz Geodataframe, GeoAlchemy zajmie się kolumną geom za Ciebie. Oto przykładowy kod:
Warto zauważyć, że parametr „if_exists” umożliwia obsługę sposobu dodawania ramki danych do tabeli postgres:
źródło
Mam również to samo pytanie, które zadałeś i spędziłem nad nim wiele, wiele dni (więcej, niż chciałbym przyznać), szukając rozwiązania. Zakładając poniższą tabelę postgreSQL z rozszerzeniem postGIS,
oto w końcu zacząłem pracować:
Nie mogę powiedzieć, czy moja logika połączenia z bazą danych jest najlepsza, ponieważ po prostu skopiowałem ją z innego łącza i byłem po prostu szczęśliwy, że mogłem z powodzeniem zautomatyzować (lub odzwierciedlić) moją istniejącą tabelę z rozpoznaną definicją geometrii. Piszę Pythona do kodu przestrzennego SQL dopiero od kilku miesięcy, więc wiem, że jest wiele do nauczenia się.
źródło
Mam rozwiązanie, które wymaga tylko psycopg2 i jest zgrabne (poza tym oczywiście geopandą). Generalnie złą praktyką jest iterowanie po
(Geo)DataFrame
obiektach, ponieważ jest powolne, ale w przypadku małych lub jednorazowych zadań nadal wykona zadanie.Zasadniczo działa, zrzucając geometrię do formatu WKB w innej kolumnie, a następnie ponownie rzutuje ją na
GEOMETRY
tekst podczas wstawiania.Pamiętaj, że będziesz musiał wcześniej utworzyć tabelę z odpowiednimi kolumnami.
źródło