Memasukkan poin ke SQL Server menggunakan pymssql?

12

Saya mengumpulkan nilai X dan Y dari layanan web (Twitter) melalui skrip python. Dalam jangka panjang, ini akan berlangsung selama beberapa bulan dan saya bermaksud berhenti di sekitar angka 6 juta poin.

Koord asli yang saya dapatkan adalah WGS84 secara geografis, tetapi saya perlu mengubahnya menjadi WGS Web Mercator yang diproyeksikan. Saya nantinya akan menerbitkan tabel ini ke layanan peta ArcGIS Server dan menyimpannya.

Ini adalah proyek pribadi untuk mempelajari python tanpa batas waktu dan bertanya-tanya apakah itu akan menjadi ide yang baik untuk hanya menggunakan tipe spasial asli dari SQL Server?

Rencana saya yang belum teruji:

  • BUAT tabel dengan SSMS, dengan pengaturan bidang GEOMETRI (dan beberapa atribut lainnya)
  • Dalam skrip python saya, gunakan arcpy atau pyproj untuk mengonversi lat / lons di WGS84 menjadi WGS84 Web Mercator (atau bisakah saya menghindari ini entah bagaimana dan semua dapat dicapai dengan SQL?)
  • Manfaatkan pymssql untuk INSERT catatan, dan masukkan titik ke dalam bidang GEOMETRI dalam tabel.

Pertanyaan saya adalah, apa yang akan menjadi pendekatan yang baik, sederhana dan efisien untuk mengambil sepasang lat / lons di WGS84, dan kemudian memasukkan mereka ke dalam tabel SQL Server yang menggunakan tipe spasial SQL Server dan memiliki lapisan poin yang dihasilkan yang ada di WGS84 Web Mercator, sehingga saya dapat membuat / meminta mereka di ArcGIS Desktop 10.1?

Saya memang memiliki akses ke arcpy / ArcSDE 10.1 jika perlu tetapi berharap untuk menggunakan ini sebagai contoh tidak memerlukan ArcSDE.

Simon
sumber
gunakan data pyproj terlebih dahulu kemudian masukkan data ke dalam basis data MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) akan membuat WKT untuk itu
simplexio
Dan saya akan menggunakan PostGIS jika Anda bisa
simplexio
Terima kasih, tapi tolong bisakah Anda memasukkan ini ke dalam jawaban dan menguraikan mengapa Anda juga akan menggunakan PostGIS.
Simon

Jawaban:

6

Saya melanjutkan rencana saya, sebagaimana dinyatakan dalam Pertanyaan.

Untuk tujuan memasukkan poin ke dalam SQL Server, postingan ini sangat berguna bagi saya.

Inilah yang bekerja untuk saya:

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()
Simon
sumber
Bagaimana Anda mengatur untuk mengubah koordinat Anda dari WGS84 geografis ke Web Mercator? Di atas tampak seolah-olah Anda telah melakukannya
Peter Horsbøll Møller
1
lihat perpustakaan pyproj. berhasil! Tanyakan Q lain jika Anda ingin spesifik.
Simon
2

Saya tidak yakin dengan seluruh persyaratan alur kerja Anda, tetapi jika Anda memiliki akses ke arcpy, maka Anda dapat menggunakan arcpy.ConvertCoordinateNotation_managementuntuk mengambil tabel poin SQL Anda dan mengubahnya menjadi kelas fitur titik pada proyeksi apa pun yang Anda perlukan. Tidak perlu untuk SQL Jenis spasial server atau ArcSDE.

Damon
sumber
Solusi yang mungkin. Namun, saya berpikir bahwa jika saya mengumpulkan 6 juta poin, maka menjalankan alat ini pada akhirnya bisa memakan waktu. Dengan asumsi saya bisa melakukannya dengan cepat, dengan begitu saya bisa benar-benar melihat poin sementara skrip masih mengumpulkan.
Simon
1

Saya berasumsi bahwa Anda memiliki satu atau beberapa file besar yang diisi dengan xy dan beberapa data lainnya. Pertama, setahu saya tidak ada dukungan proyeksi di MS SQL (2008 r2 atau lebih baru). ada solusi pihak ketiga dan pustaka proj.net yang dapat Anda gunakan untuk membangunnya. Oleh karena itu saya melihat dua opsi ketika menyimpan data ke basis data, jika menggunakan MS SQL, Anda perlu memproyeksikan ulang data ke dalam proyeksi yang diinginkan sebelum memasukkan basis data atau Anda hanya membuang data ke dB PostGIS dan melakukan transformasi di sana. PostGIS memiliki toolset yang jauh lebih baik dalam database daripada MS SQL

simplexio
sumber
0

geoAlchemy seharusnya melakukan pekerjaan menggunakan GeometryColumns. Namun, saya tidak dapat membuatnya berfungsi pada Windows / Python 2.7 / sqlalchemy 0.9.6 karena AttributeError: ketik objek 'ColumnProperty' tidak memiliki atribut 'ColumnComparator'

Matej
sumber