¿Insertar puntos en SQL Server usando pymssql?

12

Estoy recopilando valores X e Y de un servicio web (Twitter) a través de un script de Python. A la larga, esto se extenderá durante un período de meses y tengo la intención de parar alrededor de los 6 millones de puntos.

Los códigos originales que estoy obteniendo son geográficos WGS84, pero tendré que convertirlos a WGS Web Mercator proyectado. Posteriormente publicaré esta tabla en un servicio de mapas de ArcGIS Server y la guardaré en caché.

Este es un proyecto personal para aprender Python sin fecha límite y se preguntaba si sería una buena idea utilizar únicamente los tipos espaciales nativos de SQL Server.

Mi plan actual no probado:

  • CREA una tabla con SSMS, con una configuración de campo GEOMETRÍA (y algunos otros atributos)
  • En mi script de Python, utilizo arcpy o pyproj para convertir los lat / lons en WGS84 a WGS84 Web Mercator (¿o puedo evitar esto de alguna manera y todo se puede lograr con SQL?)
  • Utilice pymssql para INSERTAR registros e inserte los puntos en el campo GEOMETRÍA de la tabla.

Mi pregunta es, ¿cuál sería un enfoque bueno, simple y eficiente para tomar un par de lat / lons en WGS84 y luego insertarlos en una tabla de SQL Server haciendo uso de tipos espaciales de SQL Server y tener una capa de puntos resultante que está en WGS84 Web Mercator, para que pueda renderizar / consultarlos en ArcGIS Desktop 10.1.

Tengo acceso a arcpy / ArcSDE 10.1 si es necesario, pero esperaba usar esto como un ejemplo de no requerir ArcSDE.

Simón
fuente
use primero los datos de pyproj y luego inserte los datos en la base de datos MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) creará WKT para él
simplexio
Y usaría PostGIS si puedes
simplexio
Gracias, pero por favor, ¿puede poner esto en una respuesta y explicar por qué usaría PostGIS también?
Simon

Respuestas:

6

Seguí adelante con mi plan, como se indica en la pregunta.

Con el fin de insertar puntos en SQL Server, esta publicación fue muy útil para mí.

Esto es lo que funcionó para mí:

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()
Simón
fuente
¿Cómo logró transformar sus coordenadas de WGS84 geográfico a Web Mercator? En lo anterior parece que lo has hecho
Peter Horsbøll Møller el
1
mira la biblioteca pyproj. funciona de maravilla! Pide otra Q si quieres detalles.
Simon
2

No estoy seguro de todos sus requisitos de flujo de trabajo, pero si tiene acceso a arcpy, entonces podría usar arcpy.ConvertCoordinateNotation_managementpara tomar su tabla de puntos SQL y convertirlos en una clase de entidad de puntos en cualquier proyección en la que lo necesite. No necesita SQL Tipos espaciales de servidor o ArcSDE.

Damon
fuente
Solución posible. Sin embargo, estaba pensando que si estoy acumulando 6 millones de puntos, ejecutar esta herramienta al final podría llevar un tiempo. Supuse que podía hacerlo sobre la marcha, de esa manera puedo ver los puntos mientras el guión aún se está recopilando.
Simon
1

Supongo que tiene uno o varios archivos grandes llenos de xy y algunos otros datos. Primero, que yo sepa, no hay soporte de proyección en MS SQL (2008 r2 o posterior). Hay soluciones de terceros y la biblioteca proj.net que puede usar para construir una. Por lo tanto, veo dos opciones al almacenar datos en la base de datos, si usa MS SQL, debe volver a proyectar los datos en la proyección deseada antes de insertar la base de datos o simplemente volcar los datos en PostGIS db y transformar allí. PostGIS tiene un conjunto de herramientas mucho mejor en la base de datos que MS SQL

simplexio
fuente
0

Se supone que geoAlchemy hace el trabajo usando GeometryColumns. Sin embargo, no pude hacerlo funcionar en Windows / Python 2.7 / sqlalchemy 0.9.6 debido a AttributeError: el objeto de tipo 'ColumnProperty' no tiene el atributo 'ColumnComparator'

Matej
fuente