Вставити точки в SQL Server за допомогою pymssql?


12

Я збираю значення X і Y з веб-сервісу (Twitter) за допомогою сценарію python. У перспективі це триватиме протягом кількох місяців, і я маю намір зупинитися на рівні близько 6 мільйонів балів.

Оригінальні координати, які я отримую, - це географічні WGS84, але мені потрібно буде перетворити їх на прогнозований Web Mercator WGS. Пізніше я опублікую цю таблицю в сервісі карт ArcGIS Server і кешуйте її.

Це особистий проект для вивчення пітона без граничного терміну, і йому було цікаво, чи було б гарною ідеєю використовувати виключно локальні просторові типи з SQL Server?

Мій поточний неперевірений план:

  • Створіть таблицю з SSMS, із встановленням поля GEOMETRY (та деякими іншими атрибутами)
  • У моєму сценарії python використовуйте arcpy або pyproj для перетворення Lat / lons в WGS84 в WGS84 Web Mercator (чи я можу якось уникнути цього і все, що можна досягти за допомогою SQL?)
  • Використовуйте pymssql для записів INSERT та вставте точки в поле GEOMETRY у таблиці.

Моє запитання полягає в тому, що було б добрим, простим та ефективним підходом взяти пару лат / лонів у WGS84, а потім вставити їх у таблицю SQL Server, використовуючи просторові типи SQL Server і мати результуючий шар точок, який знаходиться у WGS84 Web Mercator, щоб я міг надати / запитувати їх у ArcGIS Desktop 10.1?

У мене є доступ до arcpy / ArcSDE 10.1, якщо це необхідно, але я сподівався використати це як приклад не вимагати ArcSDE.


спочатку використовуйте дані pyproj, а потім вставляйте їх у базу даних MS SQL. геометрія :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) створить для неї WKT
simplexio

І я б скористався PostGIS, якщо зможете
simplexio

Дякую, але будь ласка, ви можете поставити це у відповідь та детально пояснити, чому б ви також використовували PostGIS.
Саймон

Відповіді:


6

Я продовжував свій план, як зазначено в питанні.

З метою вставки очок у SQL Server ця публікація була для мене дуже корисною.

Ось що для мене спрацювало:

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

Як вам вдалося перетворити ваші координати з географічного WGS84 в Web Mercator? У вищесказаному виглядає так, ніби ви це зробили
Пітер Хорсбёлл Мёллер

1
подивитися бібліотеку pyproj. працює частування! Задайте інший Q, якщо вам потрібні конкретні дані
Саймон

2

Я не впевнений у всіх ваших вимогах робочого процесу, але якщо у вас є доступ до arcpy, ви можете скористатись arcpy.ConvertCoordinateNotation_managementтаблицею точок SQL та перетворити їх у клас точкових функцій при будь-якій проекції, яка вам потрібна. Немає необхідності в SQL Просторові типи серверів або ArcSDE.


Можливе рішення. Однак я думав, що якщо я наберу 6М балів, то запуск цього інструменту в кінці може зайняти деякий час. Припускав, що я можу це зробити на льоту, таким чином я можу насправді переглянути очки, поки сценарій все ще збирається.
Симон

1

Я припускаю, що у вас є один або кілька великих файлів, заповнених xy та деякими іншими даними. По-перше, наскільки мені відомо, немає підтримки проекцій в MS SQL (2008 r2 або новішої версії). є сторонні рішення та бібліотека proj.net, які ви можете використовувати для створення. Тому я бачу два варіанти під час зберігання даних у базі даних, якщо використовується MS SQL, перед тим, як вставити базу даних, потрібно повторно відхилити дані в потрібну проекцію або просто скинути дані в PostGIS db і зробити там перетворення. PostGIS має набагато кращий набір інструментів у базі даних, ніж MS SQL


0

GeoAlchemy повинен виконувати цю роботу за допомогою GeometryColumns. Однак мені не вдалося змусити його працювати на Windows / Python 2.7 / sqlalchemy 0.9.6 через AttributeError: тип об’єкта 'ColumnProperty' не має атрибута 'ColumnComparator'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.