2017-03-08 6 views
0

Ich verwende Pandas und ein Dataframe, um mit einigen Daten umzugehen. Ich möchte die Daten in eine mySQL-Datenbank laden, in der eines der Felder ein Point ist.Insert Geometriepunkt MySQL aus Pandas Dataframe

In der Datei, die ich mit Python analysiere, habe ich das Lat und Lon der Punkte.

Ich habe einen Datenrahmen (df) mit der Punktinformation (id und coords) erstellt:

id coords 
A GeomFromText(' POINT(40.87 3.80) ') 

Ich habe in coords den Befehl erforderlich in mySQL gespeichert einen Punkt aus dem Text zu erstellen. Wenn jedoch die Ausführung:

from sqlalchemy import create_engine 
engine = create_engine(dbconnection) 

df.to_sql("point_test",engine, index=False, if_exists="append") 

Ich habe folgende Fehlermeldung:

DataError: (mysql.connector.errors.DataError) 1416 (22003): Cannot get geometry object from data you send to the GEOMETRY field

Triggered because df.to_sql transforms the GeomFromText(' POINT(40.87 3.80) ') into string as "GeomFromText(' POINT(40.87 3.80) ')" when it should be the execution of the function GeomFromText in mySQL.

Hat jemand einen Vorschlag über hat, wie in mySQL geometrischen Feldern Informationen, die ursprünglich in Textform mit Pandas Datenrahmen einfügen?

Antwort

0

Eine Umgehung besteht darin, eine temporäre Tabelle mit dem String der geometrischen Information zu erstellen, die hinzugefügt werden muss, und dann die Tabelle point_test mit einem Aufruf von ST_GeomFromText aus der temporären Tabelle zu aktualisieren.

Angenommen Datenbank mit Tabelle POINT_TEST mit id (VARCHAR (5)) und Koord (POINT):

a.Create df Datenrahmen als ein Beispiel unter Punkt "A" und "B"

dfd = np.array([['id','geomText'], 
      ["A","POINT(50.2 5.6)"], 
      ["B","POINT(50.2 50.4)"]]) 

df=pd.DataFrame(data=dfd[1:,:], columns=dfd[0,:]) 

b.Add Punkt "A" und "B" in POINT_TEST sondern nur die ID und fügt die Zeichenfolge "geomText" in die Tabelle temp_point_test

df[['id']].to_sql("point_test",engine, index=False, if_exists="append") 

df[['id', 'geomText']].to_sql("temp_point_test",engine, index=False, if_exists="append") 

c. Aktualisieren Sie die Tabelle point_test mit dem Punkt aus der Tabelle temp_point_test, indem Sie ST_GeomFromText() auf die Auswahl anwenden. Schließlich, temp_point_test:

conn = engine.connect() 

conn.execute("update point_test pt set pt.coords=(select ST_GeomFromText(geomText) from temp_point_test tpt "+ 
        "where pt.id=tpt.id)") 

conn.execute("drop table temp_point_test") 

conn.close()