Insérer des points dans SQL Server à l'aide de pymssql?

12

Je collecte des valeurs X et Y à partir d'un service Web (Twitter) via un script python. À long terme, cela se déroulera sur une période de plusieurs mois et j'ai l'intention de m'arrêter à environ 6 millions de points.

Les coordonnées d'origine que j'obtiens sont des WGS84 géographiques, mais je devrai les convertir en WGS Web Mercator projeté. Je publierai plus tard cette table sur un service de carte ArcGIS Server et la mettre en cache.

Il s'agit d'un projet personnel pour apprendre le python sans délai et je me demandais si ce serait une bonne idée de n'utiliser que les types spatiaux natifs de SQL Server?

Mon plan actuel non testé:

  • CRÉER une table avec SSMS, avec une configuration de champ GÉOMÉTRIE (et quelques autres attributs)
  • Dans mon script python, utilisez arcpy ou pyproj pour convertir les lat / lons dans WGS84 en WGS84 Web Mercator (ou puis-je éviter cela en quelque sorte et tout cela est réalisable avec SQL?)
  • Utilisez pymssql pour INSÉRER les enregistrements et insérez les points dans le champ GÉOMÉTRIE du tableau.

Ma question est, quelle serait une bonne, simple et efficace approche pour prendre une paire de lat / lons dans WGS84, puis les insérer dans une table SQL Server en utilisant des types spatiaux SQL Server et avoir une couche de points résultante qui est dans WGS84 Web Mercator, pour pouvoir les rendre / interroger dans ArcGIS Desktop 10.1?

J'ai accès à arcpy / ArcSDE 10.1 si besoin est, mais j'espérais l'utiliser comme exemple de ne pas avoir besoin d'ArcSDE.

Simon
la source
utilisez d'abord les données pyproj puis insérez les données dans la base de données MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) créera WKT pour cela
simplexio
Et j'utiliserais PostGIS si vous le pouvez
simplexio
Merci, mais s'il vous plaît pouvez-vous mettre cela dans une réponse et expliquer pourquoi vous utiliseriez également PostGIS.
Simon

Réponses:

6

J'ai poursuivi mon plan, comme indiqué dans la question.

Dans le but d'insérer des points dans SQL Server, ce message m'a été très utile.

Voici ce qui a fonctionné pour moi:

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()
Simon
la source
Comment avez-vous réussi à transformer vos coordonnées de WGS84 géographique en Web Mercator? Dans ce qui précède, il semble que vous l'ayez fait
Peter Horsbøll Møller
1
regardez la bibliothèque pyproj. fonctionne un régal! DEMANDEZ un autre Q si vous voulez des détails.
Simon
2

Je ne suis pas sûr de toutes vos exigences de flux de travail, mais si vous avez accès à arcpy, vous pouvez utiliser arcpy.ConvertCoordinateNotation_managementpour prendre votre table SQL de points et les convertir en une classe d'entités ponctuelles à la projection dans laquelle vous en avez besoin. Pas besoin de SQL Types spatiaux de serveur ou ArcSDE.

Damon
la source
Solution possible. Cependant, je pensais que si je collectais 6 millions de points, l'exécution de cet outil à la fin pourrait prendre un certain temps. Je supposais que je pouvais le faire à la volée, de cette façon, je peux réellement voir les points pendant que le script est encore en train de collecter.
Simon
1

Je suppose que vous avez un ou plusieurs gros fichiers remplis de xy et d'autres données. Tout d'abord, à ma connaissance, il n'y a pas de support de projection dans MS SQL (2008 r2 ou version ultérieure). il existe des solutions tierces et une bibliothèque proj.net que vous pouvez utiliser pour en créer une. Par conséquent, je vois deux options lors du stockage des données dans la base de données, si vous utilisez MS SQL, vous devez reprojeter les données dans la projection souhaitée avant d'insérer la base de données ou simplement vider les données dans PostGIS db et les transformer. PostGIS a un ensemble d'outils beaucoup plus performant dans la base de données que MS SQL

simplexio
la source
0

geoAlchemy est censé faire le travail à l'aide de GeometryColumns. Cependant, je n'ai pas pu le faire fonctionner sur Windows / Python 2.7 / sqlalchemy 0.9.6 en raison d'AttributeError: l'objet de type 'ColumnProperty' n'a pas d'attribut 'ColumnComparator'

Matej
la source