Czy Mapnik może renderować dane przestrzenne z SQL Server?

10

To bardzo proste pytanie - chcę tylko wiedzieć, czy ktoś może potwierdzić, że z powodzeniem użył Mapnika do renderowania kafelków bezpośrednio z danych przechowywanych w SQL Server. (A jeśli tak, to co zrobiłeś, aby działało?) Nie odpowiadaj, chyba że osobiście potwierdzisz, że jest to możliwe ... nie tylko, że powinno być możliwe

Widziałem ludzi polecających Mapnik do renderowania danych z SQL Server w wątkach takich jak ten: Dowolne dobre mechanizmy renderowania map dla SqlGeometry / SqlGeography

Ponadto strona internetowa mapnik stwierdza, że ​​„wszystkie formaty OGR są obsługiwane”: http://mapnik.org/faq/#data

Jednak całkowicie nie byłem w stanie użyć połączenia z moją lokalną bazą danych SQL Server jako źródła danych dla warstwy Mapnik. Jako test używam prostego testu OGR VRT, który wykonuje instrukcję SQL na serwerze SQL Server, aby wybrać pojedynczą liniową wielokąt geograficzny jako dobrze znany tekst w następujący sposób:

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

(Uwaga: próbowałem również tego z bardziej konwencjonalną składnią SELECT * FROM Table). OGRINFO z powodzeniem otwiera ten VRT i zgłasza, co następuje:

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)

Jednak ustawienie tego samego pliku VRT jako źródła danych dla warstwy Mapnik zgłasza następujący błąd:

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;'.

Wygląda na to, że istnieje pewien problem między sposobem, w jaki sterownik OGR tworzy połączenie SQL Server a Mapnikiem, ale nie wiem dokładnie, gdzie to jest. Nie znalazłem jeszcze żadnych dowodów ani przykładów sugerujących, że ktokolwiek inny byłby w stanie to osiągnąć ...

Alastair Aitchison
źródło

Odpowiedzi:

2

Wydaje się, że brakuje jasnego przeglądu na stronie pomocy OGR Virtual Format . Wyrażenie, które może „zapewnić plik kotwicy dla dostępu do źródeł danych nie zorientowanych na pliki” wydaje się sugerować, że można użyć dowolnego typu połączenia, ale nie jestem pewien, czy tak jest.

Jego pierwotną funkcją było umożliwienie tworzenia danych przestrzennych ze źródeł nieprzestrzennych, na przykład poprzez połączenie kolumny X i Y w tabeli bazy danych w celu utworzenia elementów punktowych.

Nie ma jednak powodu, dla którego przestrzenna baza danych nie może być również używana do tego celu, ale powinieneś użyć standardowego połączenia ODBC zamiast sterownika MSSQL .

W tym celu należy utworzyć DSN (nazwę źródła danych) w systemie Windows. Następnie użyj połączenia ODBC i DSN w konfiguracji warstwy wirtualnej. Więc jeśli nazwa DSN nosi nazwę 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>

Kilka dodatkowych szczegółów na temat tworzenia wirtualnych warstw znajduje się na stronie wiki MapServer i stronie Virtual Spatial Data .

Nawiasem mówiąc, świetny post na blogu . Nie martwiłbym się zbytnio używaniem Pythona 3.x - prawie wszystkie przydatne biblioteki GIS są nadal w wersji 2.x A typy SQL Server Geometria i Geografia są świetne. Jedynym minusem jest to, że SQL Server niestety wydaje się obywatelem drugiej kategorii w świecie open source pod względem postów na blogu i integracji z innymi narzędziami.

geografia
źródło
Dziękuję za odpowiedź. Próbowałem również z połączeniem ODBC do SQL Server w VRT, i niestety powoduje to ten sam błąd. Nie sądzę, że jest to problem z połączeniem OGR VRT z SQL Server jako takim, ponieważ mogę załadować ten VRT w QGIS lub OGR2OGR, powiedzmy, i uzyskać dostęp do funkcji SQL bez żadnego problemu. Myślę, że to problem ze sterownikiem mapnik OGR, ale jak mówisz, niestety nie, że wiele osób OpenSource używać SQL Server :( Forunately, MapServer robi praca z SQL Server tak, chociaż ja wolę rendering mapnik jest, będę musiał pracować z że zamiast tego
Alastair Aitchison
@alastair - Czy na pewno nie ma różnicy? W MSSQL nic nie docierało do bazy danych za pośrednictwem Mapnika, ale dzięki ODBC SQL Profiler pokazał, że zapytania są wykonywane. Spróbuję później z prawdziwymi danymi.
geographika,
0

Możesz użyć formatu wirtualnego (GDAL), aby pobrać dane z bazy danych 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>

źródło: http://alastaira.wordpress.com/2011/06/16/tile-rendering-with-mapnik-part-1-of-n-where-n-is-large/

Chociaż polecam Postgres PostGIS (ma lepsze funkcje geometrii po stronie bazy danych)

Mapperz
źródło
MySQL -> MS SQL. Chciałem to poprawić sam, ale narzeka na „potrzeba co najmniej 6 znaków w edycji”.
Igor Brejc,
1
Nie wiem, czy zdajesz sobie sprawę, ale link blog podałeś jest od autora pytanie ....
Kelso
@Mapperz - dziękuję za poświęcenie czasu na odpowiedź, ale proszę ponownie przeczytać moje pytanie - chcę usłyszeć od każdego, kto osobiście potwierdzi, że ma Mapnik do połączenia z SQL Server - nie tylko, że teoretycznie powinno to być możliwe. Jak zauważa Kelso, blog, do którego linkujesz, jest napisany przeze mnie, a ponadto, jeśli faktycznie go przeczytasz, zobaczysz, że opisuję, jak byłem udało mi się uzyskać połączenia OGR (stąd dlaczego publikuję to pytanie)!. Ponadto, na jakiej podstawie powiedziałbyś, że PostGIS ma lepsze funkcje geometrii?
Alastair Aitchison
@Alastair: spróbuj zadać pytanie na liście mailingowej OSM-dev ( lists.openstreetmap.org/listinfo/dev ), jest tam wielu Mapnikerów.
Igor Brejc,