7 votos

Importar datos espaciales de SQL Server a PostGIS

¿Existe una herramienta gratuita para importar datos espaciales de SQL Server a PostGIS?

En concreto, quiero poder proporcionar las cadenas de conexión a mis instancias de SQL Server y PostgreSQL, especificar la(s) tabla(s) que quiero importar y hacer clic en un botón para realizar la importación.

0 votos

GeoKettle es la alternativa de código abierto spatialytics.org/projects/geokettle (compatible con Postgres y SQL Server 2008.

0 votos

Que yo sepa, no existe ninguna herramienta gratuita de este tipo. Lo más parecido en cuanto a herramientas de "clic de botón" es FME workbench.

0 votos

Gracias @Mapperz. De momento esta parece mi mejor opción, aunque parece que puede ser más de lo que necesito. Como he comentado más abajo, básicamente estoy buscando una simple importación de una tabla SQL en PostgreSQL, pero que incluya la columna de geometría.

5voto

dlanod Puntos 8661

También puede utilizar la envoltura de datos extranjeros ogrfdw que se apoya en GDAL. Eso es lo que yo uso para mis necesidades de importación de SQL Server / a PostGIS.

https://github.com/pramsey/pgsql-ogr-fdw

Se instala como parte de los instaladores de Windows PostGIS stackbuilder.

Así es como me conecto a SQL Server. También se puede utilizar el controlador MSSQLSpatial, pero he encontrado que el uso de ODBC es más predecible si no tienes datos espaciales.

1) Si aún no lo ha hecho, instale la extensión ogr fdw en su base de datos PostgreSQL con -

CREAR EXTENSIÓN ogr_fdw;

2) CREAR un servidor extranjero:

2a) Si desea utilizar el tipo ODBC, registre un DSN de sistema para su base de datos SQL Server. En mi ejemplo lo llamaré MYSS. Ten en cuenta que MSSQLSpatial soporta conexiones sin DSN, por lo que esta parte no es necesaria si utilizas eso.

Suelo usar ODBC ya que la mayoría de mis datos de sql server no son espaciales y el MSSQlSPatial tiene un comportamiento peculiar de renombrar la clave primaria a fid. ODBC siempre añade otro fid que ignoro.

-- así es como se hace ODBC (puede ser sql server u oracle o lo que sea)

 CREATE SERVER svr_myss
   FOREIGN DATA WRAPPER ogr_fdw
    OPTIONS (datasource 'ODBC:myuser/mypassword@MYSS',format 'ODBC');

-- así es como se hace MS SQL Spatial. Tenga en cuenta que, por defecto, el controlador de MSSPatial sólo listará las tablas con geometría (y creo que de tipo geográfico). Tienes que establecer una variable de entorno: MSSQLSPATIAL_LIST_ALL_TABLES=yes

para que liste todas las tablas.

Consulte esto para obtener más detalles: http://www.gdal.org/drv_mssqlspatial.html

-- sustituya localhost por el nombre del servidor sql si no está en el mismo servidor. El 1433 no es necesario, pero si usted está ejecutando en un puerto no estándar (que hago), entonces usted tendría que especificar el puerto.

CREATE SERVER svr_myss
   FOREIGN DATA WRAPPER ogr_fdw
   OPTIONS (datasource 'MSSQL:server=localhost,1433;database=mygisdb;user=myuser;password=mypassword',format 'MSSQLSpatial');

También puedes hacer trust y demás, pero eso sólo funciona si tienes postgresql corriendo bajo una cuenta de windows que tenga derechos sobre la base de datos.

4) CREAR un esquema para albergar sus tablas externas:

CREAR SCHEMA myss;

5) Ahora puedo enlazar todas las tablas de mi esquema dbo. así:

IMPORTAR ESQUEMA FOREIGN "dbo." FROM SERVER svr_myss INTO myss;

6) Debería ver todas las tablas listadas como tablas foráneas y entonces puede consultarlas como cualquier otra tabla en PostgreSQL e incluso unirlas con tablas de PostgreSQL a su gusto. Genial.

Una advertencia es que si tienes un montón de tablas, como más de 200 en tu base de datos de SQL Server, es posible que quieras especificarlas como parte de tu CREATE SERVER. GDAL ODBC es un poco tonto en la consulta de tablas, y especificar las tablas de antemano evita que intente siempre consultar todo el catálogo en cada consulta, por lo que sus consultas contra las tablas extranjeras serán mucho más rápidas.

Para ello, debes configurar tu CREATE SERVER de la siguiente manera:

CREATE SERVER svr_myss
   FOREIGN DATA WRAPPER ogr_fdw
        OPTIONS (datasource 'ODBC:myuser/mypassword@MYSS,dbo.User,dbo.AnotherTable',
format 'ODBC');

7) Para copiar los datos hago una inserción masiva como

SELECT * INTO myss.orders FROM myss.dbo_orders;

Alternativamente, puede envolver su tabla extranjera en una vista materializada y configurar un horario para refrescar su vista materializada con pgagent por ejemplo.

CREATE MATERIALIZED VIEW myss.vw_orders

0 votos

Gracias, @LR1234567. ¿Por casualidad tienes algún código de ejemplo que puedas compartir?

0 votos

He actualizado mi respuesta. Le di a enviar demasiado rápido, así que no terminé el ejemplo de la vista materializada, pero espero que entiendas la idea.

0 votos

Ah, me olvidé de mencionar que ogr_fdw lava los nombres de las tablas y los nombres de las columnas. Esto es para que no tengas que pasarte la vida citando los nombres de las columnas y las tablas. Si realmente quieres que tus tablas y columnas tengan el mismo nombre exacto que en sql server, puedes configurar las opciones de lavado como se describe aquí - postgresonline.com/journal/archives/

3voto

neouser99 Puntos 1203

Ogr2ogr puede hacerlo por ti, pero es una herramienta de línea de comandos.

Aquí está la referencia para MS SQL Server:

http://www.gdal.org/drv_mssqlspatial.html

y Postgres / PostGIS:

http://www.gdal.org/drv_pg.html

0 votos

Se lo agradezco. Parece un poco complicado, pero lo probaré si GeoKettle no me funciona. Además, parece que es más en las características individuales de lo que necesito ser. Básicamente necesito copiar filas de una base de datos a otra, pero que incluya los campos de geometría. Gracias por la información.

0 votos

Además, si alguien tiene algún código de ejemplo que haga esto, sería de gran ayuda. Gracias.

1voto

sebastiaan Puntos 2910

Una solución con software comercial es FME desde el software Safe . Simplemente se selecciona una base de datos de origen (aquí MSSQL) y una base de datos de destino (postgis). Todo se hace visualmente y supone un mínimo de entradas de parámetros.

Esto es lo que parece en el editor visual:

enter image description here

La herramienta también ofrece flexibilidad para cambiar los nombres de los atributos y los tipos de datos.

La herramienta no es gratuita, pero una licencia de prueba le dará la opción de probarla. Como tal, si se trata de un desafío de una sola vez, resolvería su problema de forma gratuita - esta vez.

1 votos

FME es bastante caro, así que creo que voy a probar primero las opciones de código abierto. Pero gracias por la información.

1voto

mapBaker Puntos 5348

Utilizando QGIS, cargue su capa espacial MSSQL en el lienzo del mapa.

Asegúrese de que ha establecido una conexión con su base de datos PostGIS

Usando el QGIS DB Manager, simplemente conéctese a su base de datos PostGIS y use la herramienta Importar Capa Vectorial para importar la capa QGIS - la capa espacial MSSQL - a su base de datos PostGIS.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X