¿Puede Mapnik representar datos espaciales desde SQL Server?

10

Esta es una pregunta muy simple: solo quiero saber si alguien puede confirmar que ha utilizado con éxito Mapnik para representar mosaicos directamente de los datos almacenados en SQL Server. (Y, si es así, ¿qué hizo para que funcione?) No responda a menos que haya confirmado personalmente que esto es posible ... no simplemente que debería ser posible

He visto a personas recomendar Mapnik para representar datos de SQL Server en subprocesos como este: Cualquier buen motor de representación de mapas para SqlGeometry / SqlGeography

Además, el sitio web de mapnik afirma que "todos los formatos de OGR son compatibles": http://mapnik.org/faq/#data

Sin embargo, no he podido utilizar una conexión a mi base de datos local de SQL Server como fuente de datos para una capa Mapnik. Como prueba, estoy usando una prueba sencilla OGR VRT, que ejecuta una instrucción SQL en un servidor SQL para seleccionar un único polígono de geografía en línea como texto conocido, como sigue:

<OGRVRTDataSource>
  <OGRVRTLayer name="test">
    <SrcDataSource>MSSQL:server=zangief\DENALICTP3;database=TempDB;</SrcDataSource> 
    <SrcSQL>SELECT geography::STPolyFromText('POLYGON((0 50, 2 50, 2 53, 0 53, 0 50))', 4326).STAsText() AS geomWKT</SrcSQL>
    <GeometryField encoding="WKT" field="geomWKT"/>
    <LayerSRS>EPSG:4326</LayerSRS>
    <GeometryType>wkbPolygon</GeometryType>
  </OGRVRTLayer>
</OGRVRTDataSource>

(Tenga en cuenta que también he intentado esto con la sintaxis SELECT * FROM Table más convencional). OGRINFO abre con éxito este VRT e informa lo siguiente:

ogrinfo mssql.ovf -so -al
INFO: Open of `mssql.ovf'
      using driver `VRT' successful.

Layer name: test
Geometry: Polygon
Feature Count: 1
Extent: (0.000000, 50.000000) - (2.000000, 53.000000)
Layer SRS WKT:
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]
geomWKT: String (0.0)

Sin embargo, la configuración de este mismo archivo VRT como fuente de datos para una capa Mapnik informa el siguiente error:

ERROR 1: Failed to open datasource `MSSQL:server=zangief\DENALICTP3;database=Tem
pDB;'.
Traceback (most recent call last):
  File "rundemo.py", line 48, in <module>
    provlines_lyr.datasource = mapnik.Ogr(file="mssql.ovf", layer="test")
  File "C:\OSGeo4W\apps\Python25\lib\site-packages\mapnik\__init__.py", line 418
, in Ogr
    return CreateDatasource(keywords)
RuntimeError: Failed to open datasource `MSSQL:server=zangief\DENALICTP3;databas
e=TempDB;'.

Parece que hay algún problema entre la forma en que el controlador OGR crea la conexión de SQL Server y Mapnik, pero no sé exactamente dónde está. Todavía no he encontrado ninguna evidencia o ejemplo que sugiera que alguien más haya podido lograr esto con éxito ...

Alastair Aitchison
fuente

Respuestas:

2

Parece que falta una descripción clara en la página de ayuda del formato virtual de OGR . La frase " puede proporcionar un archivo de anclaje para acceder a fuentes de datos no orientadas a archivos" parece implicar que se puede usar cualquier tipo de conexión, pero no estoy seguro de que sea así.

Su función original era permitir que se crearan datos espaciales a partir de fuentes no espaciales, por ejemplo combinando una columna X e Y en una tabla de base de datos para crear entidades de puntos.

Sin embargo, no hay ninguna razón por la que una base de datos espacial no se pueda usar también para este propósito, pero luego debe usar una conexión ODBC estándar en lugar del controlador MSSQL .

Para hacer esto, cree un DSN (Nombre de origen de datos) en Windows. Luego use la conexión ODBC y el DSN en la configuración de la capa virtual. Entonces, si su DSN se llama OSVectorMap:

<OGRVRTDataSource>
  <OGRVRTLayer name="AASQLlayer">
    <SrcDataSource>ODBC:username/password@OSVectorMap</SrcDataSource>
    <SrcSQL>SELECT geom27700.STAsText() AS geomWKT FROM TG11_Settlement_Area</SrcSQL>
    <GeometryField encoding="WKT" field="geomWKT"/>
    <LayerSRS>EPSG:4326</LayerSRS>
    <GeometryType>wkbPolygon</GeometryType>
  </OGRVRTLayer>
</OGRVRTDataSource>

Hay algunos detalles más sobre la creación de capas virtuales en la wiki de MapServer y la página de datos espaciales virtuales .

Gran publicación de blog por cierto. No me preocuparía demasiado por usar Python 3.x: casi todas las bibliotecas SIG útiles todavía están en 2.x Y los tipos de Geometría y Geografía de SQL Server son geniales. Los únicos inconvenientes son que, desafortunadamente, SQL Server parece un ciudadano de segunda clase en el mundo de código abierto en términos de publicaciones de blog e integración con otras herramientas.

geographika
fuente
Gracias por la respuesta. También he intentado con una conexión ODBC a SQL Server en el VRT, y desafortunadamente esto produce el mismo error. No creo que sea un problema con la conexión OGR VRT a SQL Server como tal, porque puedo cargar este VRT en QGIS u OGR2OGR, por ejemplo, y acceder a las funciones de SQL sin ningún problema. Creo que es un problema con el controlador Mapnik OGR, pero, como usted dice, por desgracia, no es que muchas personas OpenSource utilizan SQL Server :( Forunately, MapServer hace el trabajo con SQL Server de forma, aunque me quedo con la representación de Mapnik, voy a tener que trabajar con eso en cambio.
Alastair Aitchison
@alastair - ¿Estás seguro de que no hay diferencia? Con MSSQL, nada llegaba a la base de datos a través de Mapnik, pero con ODBC SQL Profiler mostró que las consultas se estaban ejecutando. Lo intentaré con datos reales más tarde.
geographika
0

Puede usar el formato virtual (GDAL) para extraer datos de su base de datos MSSQL

http://www.gdal.org/ogr/drv_vrt.html

    <OGRVRTDataSource>
  <OGRVRTLayer name="AASQLlayer">
    <SrcDataSource>MSSQL:server=.\SQLEXPRESS;database=OSVectorMap;trusted_connection=yes</SrcDataSource>
    <SrcSQL>SELECT geom27700.STAsText() AS geomWKT FROM TG11_Settlement_Area</SrcSQL>
    <GeometryField encoding="WKT" field="geomWKT"/>
  </OGRVRTLayer>
</OGRVRTDataSource>

fuente: http://alastaira.wordpress.com/2011/06/16/tile-rendering-with-mapnik-part-1-of-n-where-n-is-large/

Aunque recomiendo Postgres PostGIS (tiene mejores funciones de Geometría en el lado de la base de datos)

Mapperz
fuente
MySQL -> MS SQL. Quería corregirlo yo mismo, pero se queja de "al menos 6 caracteres necesarios en la edición".
Igor Brejc
1
No sé si te diste cuenta, pero el enlace del blog que proporcionaste es del autor de la pregunta ...
Kelso
@Mapperz: gracias por tomarse el tiempo para responder, pero lea mi pregunta nuevamente. Quiero escuchar a cualquiera que confirme personalmente que tienen Mapnik para conectarse a SQL Server, no solo que teóricamente debería ser posible. Como señala Kelso, el artículo del blog al que está vinculado está escrito por mí y, lo que es más, si realmente lo lee, verá que describo cómo no tuve éxito para que la conexión OGR funcionara (de ahí por qué estoy publicando esta pregunta)!. Además, ¿sobre qué base diría que PostGIS tiene mejores funciones de geometría?
Alastair Aitchison
@Alastair: intente hacer la pregunta en la lista de correo OSM-dev ( lists.openstreetmap.org/listinfo/dev ), hay muchos Mapnikers allí.
Igor Brejc