Inserire punti in SQL Server usando pymssql?


12

Sto raccogliendo i valori X e Y da un servizio Web (Twitter) tramite uno script Python. A lungo termine, questo durerà per un periodo di mesi e intendo fermarmi a circa 6 milioni di punti.

Le coordinate originali che sto ottenendo sono WGS84 geografico, ma dovrò convertirle in WGS Web Mercator proiettato. In seguito pubblicherò questa tabella su un servizio di mappe ArcGIS Server e la memorizzerà nella cache.

Questo è un progetto personale per imparare Python senza scadenza e si chiedeva se sarebbe una buona idea utilizzare esclusivamente i tipi spaziali nativi da SQL Server?

Il mio attuale piano non testato:

  • CREA una tabella con SSMS, con un'impostazione del campo GEOMETRIA (e alcuni altri attributi)
  • Nel mio script python, uso arcpy o pyproj per convertire i lat / lons in WGS84 in WGS84 Web Mercator (o posso evitare questo in qualche modo ed è tutto ottenibile con SQL?)
  • Utilizzare pymssql per INSERIRE i record e inserire i punti nel campo GEOMETRIA nella tabella.

La mia domanda è: quale sarebbe un approccio valido, semplice ed efficiente per prendere una coppia di lat / lons in WGS84 e quindi inserirli in una tabella di SQL Server usando i tipi spaziali di SQL Server e avere un layer di punti risultante che si trova in WGS84 Web Mercator, in modo che io possa renderli / interrogarli in ArcGIS Desktop 10.1?

Ho accesso ad arcpy / ArcSDE 10.1 se necessario, ma speravo di usarlo come esempio di non richiedere ArcSDE.


utilizzare prima i dati pyproj, quindi inserire i dati nel database MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) creerà WKT per questo
simplexio

E se lo potessi usare PostGIS
simplexio il

Grazie, ma per favore puoi inserire questo in una risposta e approfondire il motivo per cui dovresti utilizzare PostGIS.
Simon,

Risposte:


6

Sono andato avanti con il mio piano, come indicato nella domanda.

Allo scopo di inserire punti in SQL Server, questo post mi è stato molto utile.

Ecco cosa ha funzionato per me:

import pymssql

# connect to SQL Server instance
conn = pymssql.connect(host='localhost', user='sa', password='sa', database='nosde')

# commits every transaction automatically and setup cursor
conn.autocommit(True)
cur = conn.cursor()

# !!Chunk of code stripped out on how I get my coords, unrelated to Q.

# Store projected coords in a GEOMETRY type field
geom_type = "geometry::STPointFromText('POINT(%s %s)', 3857)" % (x, y)
    try:
        cur.execute("INSERT INTO tweets (geom) VALUES (%s)" % (geom_type))
    except TypeError:
        print "Could not INSERT", clean

    conn.close()

Come sei riuscito a trasformare le tue coordinate da WGS84 geografico a Web Mercator? In quanto sopra sembra che tu l'abbia fatto
Peter Horsbøll Møller il

1
guarda la libreria pyproj. funziona a meraviglia! Chiedere un altro Q se si desidera specifiche.
Simon,

2

Non sono sicuro di tutti i requisiti del tuo flusso di lavoro, ma se hai accesso ad arcpy, allora potresti usare arcpy.ConvertCoordinateNotation_managementper prendere la tua tabella dei punti SQL e convertirli in una classe di caratteristiche del punto in qualunque proiezione ti serva. Non c'è bisogno di SQL Tipi spaziali server o ArcSDE.


Possibile soluzione. Tuttavia, stavo pensando che se collezionassi 6 milioni di punti, l'esecuzione di questo strumento alla fine potrebbe richiedere del tempo. Supponevo di poterlo fare al volo, in quel modo posso effettivamente vedere i punti mentre la sceneggiatura sta ancora raccogliendo.
Simon,

1

Presumo che tu abbia uno o più file di grandi dimensioni riempiti con xy e alcuni altri dati. Innanzitutto, per quanto ne sappia, non esiste alcun supporto di proiezione in MS SQL (2008 r2 o successivo). ci sono soluzioni di terze parti e libreria proj.net che puoi usare per crearne una. Quindi vedo due opzioni quando si archiviano i dati nel database, se si utilizza MS SQL, è necessario riproiettare i dati nella proiezione desiderata prima di inserire il database o semplicemente scaricare i dati nel db PostGIS e trasformarli lì. PostGIS ha un set di strumenti molto migliore nel database rispetto a MS SQL


0

geoAlchemy dovrebbe fare il lavoro usando GeometryColumns. Tuttavia, non sono riuscito a farlo funzionare su Windows / Python 2.7 / sqlalchemy 0.9.6 a causa di AttributeError: l'oggetto di tipo 'ColumnProperty' non ha attributo 'ColumnComparator'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.