Inserir pontos no SQL Server usando pymssql?


12

Estou coletando valores X e Y de um serviço web (Twitter) por meio de um script python. A longo prazo, isso durará meses e pretendo parar em torno da marca de 6 milhões de pontos.

As cordas originais que estão sendo obtidas são geográficas WGS84, mas precisarei convertê-las para o WGS Web Mercator projetado. Posteriormente, publicarei esta tabela em um serviço de mapa do ArcGIS Server e o armazenará em cache.

Este é um projeto pessoal para aprender python sem prazo e estava pensando se seria uma boa ideia usar exclusivamente os tipos espaciais nativos do SQL Server?

Meu plano atual não testado:

  • CRIAR uma tabela com SSMS, com uma configuração de campo GEOMETRIA (e alguns outros atributos)
  • No meu script python, use arcpy ou pyproj para converter os lat / lons no WGS84 no WGS84 Web Mercator (ou posso evitar isso de alguma forma e tudo isso é possível com o SQL?)
  • Utilize pymssql para INSERIR registros e insira os pontos no campo GEOMETRIA da tabela.

Minha pergunta é: qual seria uma abordagem boa, simples e eficiente para pegar um par de lat / lons no WGS84 e depois inseri-los em uma tabela do SQL Server usando tipos espaciais do SQL Server e ter uma camada de pontos resultante WGS84 Web Mercator, para que eu possa renderizá-los / consultá-los no ArcGIS Desktop 10.1?

Eu tenho acesso ao arcpy / ArcSDE 10.1, se necessário, mas esperava usá-lo como um exemplo de não exigir o ArcSDE.


use os dados pyproj primeiro e depois insira os dados no banco de dados MS SQL. geometry :: STPointFromText ('POINT (' + p.longitude + '' + p.latitude + ')', 4326) criará o WKT para ele
simplexio

E eu usaria o PostGIS, se puder
simplexio 13/11/2012

Obrigado, mas por favor, você pode colocar isso em uma resposta e explicar por que você usaria o PostGIS também pls.
Simon

Respostas:


6

Fui em frente com o meu plano, conforme indicado na pergunta.

Com o objetivo de inserir pontos no SQL Server, esta postagem foi muito útil para mim.

Aqui está o que funcionou para mim:

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()

Como você conseguiu transformar suas coordenadas do WGS84 geográfico para o Web Mercator? Acima, parece que você fez isso #
Peter Horsbøll Møller

1
veja a biblioteca pyproj. funciona um deleite! Pergunte a outro Q se você quiser detalhes.
Simon

2

Não tenho certeza de todos os seus requisitos de fluxo de trabalho, mas se você tiver acesso ao arcpy, poderá usar arcpy.ConvertCoordinateNotation_managementsua tabela de pontos SQL e convertê-los em uma classe de recurso de ponto em qualquer projeção em que você precisar. Não há necessidade de SQL Tipos espaciais de servidor ou ArcSDE.


Solução possível. No entanto, eu estava pensando que, se estiver coletando 6 milhões de pontos, a execução dessa ferramenta no final poderá demorar um pouco. Estava assumindo que eu poderia fazê-lo em tempo real, para que eu possa realmente ver os pontos enquanto o script ainda está coletando.
Simon

1

Suponho que você tenha um ou vários arquivos grandes preenchidos com xy e alguns outros dados. Primeiro, que eu saiba, não há suporte para projeção no MS SQL (2008 r2 ou posterior). há soluções de terceiros e biblioteca proj.net que você pode usar para criar um. Portanto, vejo duas opções ao armazenar dados no banco de dados, se você estiver usando o MS SQL, precisará reprojetar dados na projeção desejada antes de inserir o banco de dados ou apenas despejar dados no PostGIS db e transformar lá. O PostGIS possui um conjunto de ferramentas muito melhor no banco de dados do que o MS SQL


0

geoAlchemy deve fazer o trabalho usando GeometryColumns. No entanto, não consegui fazê-lo funcionar no Windows / Python 2.7 / sqlalchemy 0.9.6 devido ao AttributeError: o objeto de tipo 'ColumnProperty' não tem atributo 'ColumnComparator'

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.