การแทรกคะแนนลงใน SQL Server โดยใช้ pymssql?


12

ฉันกำลังรวบรวมค่า X และ Y จากเว็บเซอร์วิส (Twitter) ผ่านสคริปต์ไพ ธ อน ในระยะยาวสิ่งนี้จะดำเนินไปเป็นระยะเวลาหนึ่งเดือนและฉันตั้งใจจะหยุดที่จุดประมาณ 6 ล้านจุด

coords เดิมที่ฉันได้รับคือ WGS84 ทางภูมิศาสตร์ แต่ฉันจะต้องแปลงเป็น WGS Web Mercator ที่คาดการณ์ไว้ ในภายหลังโปรดเผยแพร่ตารางนี้ไปยังบริการแผนที่ ArcGIS Server และทำการแคช

นี่เป็นโครงการส่วนบุคคลเพื่อเรียนรู้ python โดยไม่มีกำหนดและสงสัยว่ามันจะเป็นความคิดที่ดีหรือไม่ที่จะใช้ประโยชน์จากspatial ชนิดดั้งเดิมจาก SQL Server?

แผนการที่ยังไม่ทดลองในปัจจุบันของฉัน:

  • สร้างตารางด้วย SSMS พร้อมตั้งค่าฟิลด์ GEOMETRY (และแอตทริบิวต์อื่น ๆ )
  • ในสคริปต์ไพ ธ อนของฉันใช้ประโยชน์จาก arcpy หรือpyprojเพื่อแปลง lat / lons ใน WGS84 เป็น WGS84 Web Mercator (หรือฉันสามารถหลีกเลี่ยงปัญหานี้ได้อย่างใดและมันทำได้ด้วย SQL หรือไม่)
  • ใช้ประโยชน์จากpymssqlเพื่อบันทึก INSERT และแทรกจุดลงในฟิลด์ GEOMETRY ในตาราง

คำถามของฉันคืออะไรจะเป็นวิธีการที่ดีเรียบง่ายและมีประสิทธิภาพในการใช้ lat / lons คู่หนึ่งใน 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 สำหรับมัน
simplexio

และฉันจะใช้ PostGIS ถ้าคุณสามารถ
simplexio

ขอบคุณ แต่โปรดคุณช่วยตอบคำถามนี้และอธิบายว่าทำไมคุณถึงใช้ PostGIS ด้วยเช่นกัน
Simon

คำตอบ:


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 ได้อย่างไร ในข้างต้นดูเหมือนว่าคุณได้ทำ
Peter HorsbøllMøller

1
ดูที่ห้องสมุด pyproj ทำงานได้ดี! ถามอีก Q ถ้าคุณต้องการเฉพาะ
Simon

2

ฉันไม่แน่ใจเกี่ยวกับข้อกำหนดเวิร์กโฟลว์ทั้งหมดของคุณ แต่ถ้าคุณสามารถเข้าถึง arcpy ได้คุณสามารถใช้arcpy.ConvertCoordinateNotation_managementเพื่อนำตารางคะแนน SQL ของคุณมาแปลงเป็นคลาสฟีเจอร์แบบพอยต์ได้ตามต้องการไม่ว่าจะเป็น SQL เซิร์ฟเวอร์ประเภทเชิงพื้นที่หรือ ArcSDE


ทางออกที่เป็นไปได้ อย่างไรก็ตามฉันคิดว่าถ้าฉันรวบรวมคะแนน 6 ล้านคะแนนจากนั้นการเรียกใช้เครื่องมือนี้ในตอนท้ายอาจใช้เวลาสักครู่ ฉันคิดว่าฉันสามารถทำมันได้ทันทีฉันจึงสามารถดูคะแนนได้ในขณะที่สคริปต์ยังคงรวบรวมอยู่
Simon

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'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.