Вставка точек в SQL Server с помощью pymssql?

12

Я собираю значения X и Y из веб-службы (Twitter) с помощью скрипта Python. В конечном счете, это будет продолжаться в течение нескольких месяцев, и я намерен остановиться на отметке в 6 миллионов пунктов.

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

Это личный проект по изучению Python без каких-либо крайних сроков, и он задавался вопросом, будет ли хорошей идеей использовать исключительно пространственные типы из SQL Server?

Мой текущий непроверенный план:

  • СОЗДАТЬ таблицу с SSMS, с настройкой поля GEOMETRY (и некоторыми другими атрибутами)
  • В моем скрипте на python используйте arcpy или pyproj для преобразования лат / лонов в WGS84 в WGS84 Web Mercator (или я могу как-то избежать этого, и все это достижимо с помощью SQL?)
  • Используйте pymssql для вставки записей и вставьте точки в поле GEOMETRY в таблице.

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

У меня есть доступ к arcpy / ArcSDE 10.1, если это необходимо, но я надеялся использовать его в качестве примера, не требующего ArcSDE.

Саймон
источник
сначала используйте данные pyproj, затем вставьте данные в базу данных MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) создаст для него
WKT
И я бы использовал 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. работает удовольствие! Задайте другой вопрос, если хотите конкретики.
Симон
2

Я не уверен в ваших требованиях к рабочему процессу, но если у вас есть доступ к arcpy, вы можете использовать arcpy.ConvertCoordinateNotation_managementтаблицу точек SQL и преобразовать их в класс точечных объектов в любой проекции, в которой вы нуждаетесь. SQL не нужен Пространственные типы сервера или ArcSDE.

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

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

simplexio
источник
0

Предполагается, что geoAlchemy выполняет эту работу, используя GeometryColumns. Однако я не смог заставить его работать на Windows / Python 2.7 / sqlalchemy 0.9.6 из-за AttributeError: тип объекта 'ColumnProperty' не имеет атрибута 'ColumnComparator'

Матей
источник