Wstawianie punktów do SQL Server przy użyciu pymssql?

12

Zbieram wartości X i Y z usługi internetowej (Twitter) za pomocą skryptu python. W dłuższej perspektywie potrwa to kilka miesięcy i zamierzam zatrzymać się na poziomie około 6 milionów punktów.

Oryginalne współrzędne, które otrzymuję, to geograficzny WGS84, ale będę musiał przekonwertować je na rzutowany WGS Web Mercator. Później opublikuję tę tabelę w usłudze map ArcGIS Server i buforuję ją.

To jest osobisty projekt do nauki Pythona bez terminu i zastanawiał się, czy dobrym pomysłem byłoby korzystanie wyłącznie z rodzimych typów przestrzennych z SQL Server?

Mój obecny nieprzetestowany plan:

  • UTWÓRZ tabelę za pomocą SSMS, z ustawieniem pola GEOMETRIA (i innymi atrybutami)
  • W moim skrypcie pythonowym użyj arcpy lub pyproj do konwersji lat / lons w WGS84 na WGS84 Web Mercator (czy mogę to jakoś uniknąć i to wszystko jest możliwe dzięki SQL?)
  • Skorzystaj z pymssql, aby wstawić rekordy i wstaw punkty do pola GEOMETRIA w tabeli.

Moje pytanie brzmi: jakie byłoby dobre, proste i wydajne podejście, aby wziąć parę lat / lons w WGS84, a następnie wstawić je do tabeli SQL Server przy użyciu typów przestrzennych SQL Server i uzyskać wynikową warstwę punktów, która jest w WGS84 Web Mercator, dzięki czemu mogę renderować / sprawdzać je w ArcGIS Desktop 10.1?

Mam dostęp do arcpy / ArcSDE 10.1, jeśli zajdzie taka potrzeba, ale chciałem użyć tego jako przykładu niewymagania ArcSDE.

Szymon
źródło
najpierw użyj danych pyproj, a następnie wstaw dane do bazy danych MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) utworzy dla niego WKT
simplexio
I użyłbym PostGIS, jeśli możesz
simplexio,
Dzięki, ale proszę, czy możesz udzielić odpowiedzi na to pytanie i wyjaśnić, dlaczego miałbyś również korzystać z PostGIS.
Simon

Odpowiedzi:

6

Zrealizowałem mój plan, jak stwierdzono w pytaniu.

W celu wstawienia punktów do SQL Server ten post był dla mnie bardzo przydatny.

Oto, co zadziałało dla mnie:

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()
Szymon
źródło
Jak udało Ci się przekształcić swoje współrzędne z geograficznego WGS84 na Web Mercator? Powyżej wygląda to tak, jakbyś to zrobił
Peter Horsbøll Møller
1
spójrz na bibliotekę pyproj. działa uczta! Zadaj kolejne pytanie, jeśli chcesz poznać szczegóły.
Simon
2

Nie jestem pewien twoich wymagań dotyczących przepływu pracy, ale jeśli masz dostęp do arcpy, możesz użyć arcpy.ConvertCoordinateNotation_managementswojej tabeli punktów SQL i przekonwertować je na klasę obiektów punktowych przy dowolnej projekcji, w której potrzebujesz. Nie ma potrzeby SQL Typy przestrzenne serwera lub ArcSDE.

Damon
źródło
Możliwe rozwiązanie. Myślałem jednak, że jeśli zdobędę 6 milionów punktów, uruchomienie tego narzędzia na końcu może trochę potrwać. Zakładałem, że mogę to robić w locie, w ten sposób mogę faktycznie zobaczyć punkty, gdy skrypt wciąż się zbiera.
Simon
1

Zakładam, że masz jeden lub kilka dużych plików wypełnionych xy i kilka innych danych. Po pierwsze, o ile wiem, nie ma obsługi projekcji w MS SQL (2008 R2 lub nowszy). istnieją rozwiązania innych firm i biblioteka proj.net, których można użyć do zbudowania jednego. Dlatego widzę dwie opcje podczas przechowywania danych w bazie danych, jeśli używasz MS SQL, musisz ponownie skierować dane do pożądanej projekcji przed wstawieniem bazy danych lub po prostu zrzuć dane do bazy danych PostGIS i tam dokonaj transformacji. PostGIS ma o wiele lepszy zestaw narzędzi w bazie danych niż MS SQL

simplexio
źródło
0

geoAlchemy ma wykonywać zadanie za pomocą GeometryColumns. Nie mogłem jednak sprawić, aby działał w systemie Windows / Python 2.7 / sqlalchemy 0.9.6 z powodu AttributeError: typ obiektu „ColumnProperty” nie ma atrybutu „ColumnComparator”

Matej
źródło