9

驚くべきことに、この質問は (私の知る限りでは) 人気のある Web サイトで実際にはまだ尋ねられていないようです。

状況は、合計で 1 つ以上の Mio 観測を含むいくつかの csv ファイルがあることです。各観測には、とりわけ、住所が含まれています。すべてのファイルを単一の GeoDataFrame に読み込み、住所をジオコーディングし、シェープファイルを指定して空間結合を実行し、各行のポリゴンからいくつかの情報を保存することを計画しています。かなり標準的だと思います。これは、1 回限りのデータ クリーニング プロセスの一部です。

私の目標は、この最終的なデータセットを使用してデータベースをセットアップすることです。これは、データを非常に簡単に共有および検索できるようにするためです。また、いくつかの基準に基づいて観測を選択し、いくつかの分析を実行することも非常に簡単になります。

私の問題は、GeoDataFrame をデータベースに挿入する機能がまだ実装されていないように見えることです。明らかに、GeoPandas はデータベースの代用であると想定されているためです (「GeoPandas を使用すると、Python で操作を簡単に行うことができますが、そうでなければ空間データベースなどを必要とします。 PostGIS")。

もちろん、各行を反復処理して各データ ポイントを「手動で」挿入することもできますが、ここで最善の解決策を探しています。回避策として、データ型がデータベースのデータ型と競合する可能性があることも恐れています。ここで「最善の方法」はありますか?

ご協力いただきありがとうございます。

4

4 に答える 4

7

PostGIS データベース用にこれを実装したので、ここにメソッドを貼り付けることができます。MySQL の場合、コードを調整する必要があります。

最初のステップは、ジオコーディングされた列を WKB 16 進文字列に変換することでした。これは、SQLAlchemyをpyscopgに基づくエンジンで使用しており、これらのパッケージの両方がジオタイプをネイティブに理解していないためです。次の手順では、通常どおりそのデータを SQL DB に書き込み (すべてのジオメトリ列を WKB 16 進文字列を保持するテキスト列に変換する必要があることに注意してください)、最後にクエリを実行して列の型を Geometry に変更します。次の疑似コードを参照してください。

# Imports
import sqlalchemy as sal
import geopandas as gpd

# Function to generate WKB hex
def wkb_hexer(line):
    return line.wkb_hex

# Convert `'geom'` column in GeoDataFrame `gdf` to hex
    # Note that following this step, the GeoDataFrame is just a regular DataFrame
    # because it does not have a geometry column anymore. Also note that
    # it is assumed the `'geom'` column is correctly datatyped.
gdf['geom'] = gdf['geom'].apply(wkb_hexer)

# Create SQL connection engine
engine = sal.create_engine('postgresql://username:password@host:socket/database')

# Connect to database using a context manager
with engine.connect() as conn, conn.begin():
    # Note use of regular Pandas `to_sql()` method.
    gdf.to_sql(table_name, con=conn, schema=schema_name,
               if_exists='append', index=False)
    # Convert the `'geom'` column back to Geometry datatype, from text
    sql = """ALTER TABLE schema_name.table_name
               ALTER COLUMN geom TYPE Geometry(LINESTRING, <SRID>)
                 USING ST_SetSRID(geom::Geometry, <SRID>)"""
    conn.execute(sql)
于 2016-07-13T23:10:14.660 に答える
2

Hamri Saidの答えのバージョンですが、ラムダを使用しています。これは、関数が非常に短いため、私の意見では少し優れています。

# Imports
from geoalchemy2 import Geometry, WKTElement
from sqlalchemy import *

geodataframe['geom'] = geodataframe['geom'].apply(lambda geom: WKTElement(geom.wkt, srid = <your_SRID>))

db_url = 'postgresql://username:password@host:socket/database'
engine = create_engine(db_url, echo=False)

# Use 'dtype' to specify column's type
# For the geom column, we will use GeoAlchemy's type 'Geometry'
your_geodataframe.to_sql(table_name, engine, if_exists='append', index=False, 
                         dtype={'geom': Geometry('POINT', srid= <your_srid>)})
于 2020-08-07T15:51:02.330 に答える