Einfügen von Punkten in SQL Server mit pymssql?


12

Ich sammle X- und Y-Werte von einem Webdienst (Twitter) über ein Python-Skript. Langfristig wird dies über einen Zeitraum von Monaten laufen, und ich beabsichtige, bei etwa 6 Millionen Punkten anzuhalten.

Die ursprünglichen Koordinaten sind geografisch WGS84, aber ich muss diese in projizierten WGS Web Mercator konvertieren. Diese Tabelle wird später in einem ArcGIS Server-Karten-Service veröffentlicht und zwischengespeichert.

Dies ist ein persönliches Projekt zum Erlernen von Python ohne Deadline. Sie haben sich gefragt, ob es eine gute Idee ist, nur die systemeigenen räumlichen Typen von SQL Server zu verwenden.

Mein momentan ungetesteter Plan:

  • Erstellen Sie eine Tabelle mit SSMS, mit einem GEOMETRY-Feld-Setup (und einigen anderen Attributen)
  • Verwenden Sie in meinem Python-Skript arcpy oder pyproj , um die Lat / Lons in WGS84 in WGS84 Web Mercator zu konvertieren.
  • Verwenden Sie pymssql, um Datensätze einzufügen, und fügen Sie die Punkte in das Feld GEOMETRIE in der Tabelle ein.

Meine Frage ist, was wäre ein guter, einfacher und effizienter Ansatz, um ein Paar Lat / Lons in WGS84 zu verwenden und diese dann in eine SQL Server-Tabelle einzufügen, wobei räumliche SQL Server-Typen verwendet werden und eine resultierende Punktebene vorliegt WGS84 Web Mercator, damit ich sie in ArcGIS Desktop 10.1 rendern / abfragen kann?

Ich habe bei Bedarf Zugriff auf arcpy / ArcSDE 10.1, wollte dies jedoch als Beispiel dafür verwenden, dass ArcSDE nicht erforderlich ist.


Verwenden Sie zuerst pyproj-Daten und fügen Sie dann Daten in die MS SQL-Datenbank ein. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) erstellt WKT dafür
simplexio 13.11.12

Und ich würde PostGIS verwenden, wenn Sie können
simplexio

Danke, aber bitte können Sie dies in eine Antwort einfügen und erläutern, warum Sie auch PostGIS verwenden würden.
Simon

Antworten:


6

Ich habe meinen Plan, wie in Frage angegeben, ausgeführt.

Zum Einfügen von Punkten in SQL Server war dieser Beitrag für mich sehr nützlich.

Folgendes hat bei mir funktioniert:

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()

Wie haben Sie es geschafft, Ihre Koordinaten von geografischem WGS84 in Web Mercator umzuwandeln? Oben sieht es so aus, als hätten Sie es getan
Peter Horsbøll Møller

1
Schau dir die Pyproj-Bibliothek an. funktioniert ein Genuss! Fragen Sie ein anderes Q, wenn Sie Einzelheiten wünschen.
Simon

2

Ich bin mir nicht sicher, welche Workflow-Anforderungen Sie insgesamt haben. Wenn Sie jedoch Zugriff auf arcpy haben, können Sie arcpy.ConvertCoordinateNotation_managementIhre SQL-Punktetabelle verwenden, um sie in eine Point-Feature-Class mit der von Ihnen gewünschten Projektion zu konvertieren. SQL ist nicht erforderlich Server-Spatial-Types oder ArcSDE.


Mögliche Lösung. Ich dachte jedoch, wenn ich 6 Millionen Punkte sammle, könnte das Ausführen dieses Tools am Ende eine Weile dauern. Ging davon aus, dass ich es im laufenden Betrieb tun könnte, so kann ich die Punkte tatsächlich anzeigen, während das Skript noch sammelt.
Simon

1

Ich gehe davon aus, dass Sie eine oder mehrere große Dateien mit xy und einigen anderen Daten haben. Erstens gibt es meines Wissens keine Projektionsunterstützung in MS SQL (2008 r2 oder höher). Es gibt Lösungen von Drittanbietern und eine proj.net-Bibliothek, mit der Sie eine erstellen können. Daher sehe ich zwei Optionen beim Speichern von Daten in der Datenbank. Wenn Sie MS SQL verwenden, müssen Sie die Daten in die gewünschte Projektion umprojizieren, bevor Sie die Datenbank einfügen, oder Sie speichern die Daten einfach in der PostGIS-Datenbank und transformieren sie dort. PostGIS verfügt über ein viel besseres Toolset in der Datenbank als MS SQL


0

GeoAlchemy soll die Arbeit mit GeometryColumns erledigen. Unter Windows / Python 2.7 / sqlalchemy 0.9.6 konnte ich es jedoch aufgrund von AttributeError nicht zum Laufen bringen: Typ Objekt 'ColumnProperty' hat kein Attribut 'ColumnComparator'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.