Вставить точки в SQL Server?

Совершенно новичок в Python и мне он нравится, и я думаю, что это может быть просто.
В настоящее время я вставляю точки в SQL Server 2008 с помощью скрипта Python с помощью pymssql.

var1 = "hi"
lat = "55.92"
lon = "-3.29"

cursor.execute("INSERT INTO table (field1, x, y) VALUES(%s, %s, %s)", 
(var1 , lat, lon))

Это все работает нормально. Мне также нужно вставить эти координаты в поле GEOGRAPHY type (называемое geog ).

geog_type = "geography::STGeomFromText('POINT(%s %s)',4326))" % (lat, lon)

cursor.execute("INSERT INTO table (field1, x, y, geog) VALUES(%s, %s, %s, %s)", 
(var1 , lat, lon, geog_type))

Это вызывает следующее исключение:

Метка geography::STGeomFro во входном общеизвестном тексте (WKT) недействительна. Допустимые метки: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, COMPOUNDCURVE, CURVEPOLYGON и FULLGLOBE (только тип данных geography).

Из SSMS я могу запустить оператор вставки в таблицу, чтобы вставить точку.

USE [nosde]
INSERT INTO tweets (geog) 
    VALUES(
        geography::STGeomFromText(
        'POINT(55.9271035250276 -3.29431266523898)',4326))

Дайте мне знать в комментариях, если вам нужна дополнительная информация.

Некоторые из моих разработок в pastebin.


person jakc    schedule 15.11.2012    source источник
comment
Это полное сообщение об ошибке? Если да, то усекается ли geog_type в выполняемом SQL, так как ошибка жалуется на geography::STGeomFro, а не на geography::STGeomFromText   -  person Talvalin    schedule 15.11.2012
comment
Я прошел, и строка верна, поэтому не уверен, что она усекается где-то еще. pastebin.com/D5twLB5h   -  person jakc    schedule 15.11.2012


Ответы (1)


Несколько проблем - во-первых, вы указываете координаты в неправильном порядке - метод STPointFromText() сначала ожидает долготу, а затем широту.

Во-вторых, может быть проще использовать метод Point(), а не метод STPointFromText(), который не требует каких-либо манипуляций со строками — просто укажите два числовых параметра координат напрямую. http://technet.microsoft.com/en-us/library/bb933811.aspx

Но из сообщения об ошибке видно, что отправляемое вами значение пытается быть проанализировано как строка WKT. Если это так, вам все равно не нужна дополнительная geography::STGeomFromText и SRID в конце — это предполагается. Поэтому попробуйте просто предоставить:

geog_type = "'POINT(%s %s)'" % (lon, lat)

cursor.execute("INSERT INTO table (field1, x, y, geog) VALUES(%s, %s, %s, %s)", 
(var1 , lat, lon, geog_type))

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

person Alastair Aitchison    schedule 15.11.2012