[mapserver-users] Setting up a JSONP service

Eichner, Andreas - SID Andreas.Eichner at sid.sachsen.de
Tue Jan 13 06:18:12 PST 2015


You need to append the "callback" parameter to the query string:

http://localhost:8082/wfs?SERVICE=WFS&VERSION=1.1.0&request=GetFeature&TYPENAME=HU&outputformat=geojson&SRS=EPSG:3857&bbox=793732,6570204,793765,6570228&callback=foobar

You can test on the command line, too:
MS_MAPFILE=/path/to/mapfile ./mapserv QUERY_STRING='service=WFS&version=1.1.0&request=GetFeature&typename=HU& SRS=EPSG:3857&bbox=793732,6570204,793765,6570228&outputformat=application/json; subtype=geojson; charset=utf-8&callback=foobar'

Please note that IMHO "geojson" alone isn't enough. The full mimetype string should be used as reported by GetCapabilities.

HTH

> -----Ursprüngliche Nachricht-----
> Von: Lars Fricke [mailto:fricke at gisberater.com]
> Gesendet: Dienstag, 13. Januar 2015 14:22
> An: Eichner, Andreas - SID; mapserver-users at lists.osgeo.org
> Betreff: Re: [mapserver-users] Setting up a JSONP service
> 
> Hi,
> 
> I compiled MapServer after applying the patch (at least I think it was
> applied). Unfortunately the output is not JSONP format. Maybe I'm
> getting something wrong. So here is what I did:
> Applied
> patch -p1 < jsonp.diff
> 
> I got an updated mapogroutput.c.
> 
> I then compiled with the following options:
> cmake -DCMAKE_INSTALL_PREFIX=/opt \
>          -DCMAKE_PREFIX_PATH="/usr/local;/opt" \
>          -DWITH_CLIENT_WFS=ON \
>          -DWITH_CLIENT_WMS=ON \
>          -DWITH_CURL=ON \
>          -DWITH_SOS=ON \
>          -DWITH_PHP=0 \
>          -DWITH_PYTHON=ON \
>          -DWITH_SVGCAIRO=OFF \
>          -DWITH_ORACLESPATIAL=0 \
>          -DWITH_MSSQL2008=OFF \
>          -DWITH_THREAD_SAFETY=ON \
>          -DWITH_LIBXML2=ON \
>          -DWITH_MYSQL=ON\
>          -DWITH_SDE=0  .. >../configure.out.txt
> 
> Which goes through without any warning.
> 
> I do make next, getting a few warnings about the Python bindings but
> nothing about mapogroutput (ecept that it was compiled). Then sudo make
> install. No warnings.
> I then set a symlink to the new mapserv file inside cgi-bin and start my
> apache.
> 
> I changed my mapfile as you indicated:
> WEB
>      FOOTER "test"
>      IMAGEPATH "/var/www/html/tmp/"
>      TEMPPATH "/var/www/html/tmp/"
>      IMAGEURL "/html/tmp/"
>      METADATA
>        "wfs_title"          "Test"
>        "ows_onlineresource"    "http://localhost:8082/wfs?"
>        "ows_enable_request"    "*"
>        "ows_srs"    "EPSG:3857"
>        "wfs_srs"    "EPSG:3857"
>        "wfs_getfeature_formatlist" "geojson,csv,ogrgml"
>        "wfs_encoding" "UTF-8"
>      END # METADATA
>      VALIDATION
>          callback ".*"
>      END
>    END # WEB
> 
> OUTPUTFORMAT
>     NAME "geojson"
>     DRIVER "OGR/GEOJSON"
>     MIMETYPE "application/json; subtype=geojson; charset=utf-8"
>     FORMATOPTION "STORAGE=stream"
>     FORMATOPTION "FORM=SIMPLE"
>     FORMATOPTION "LCO:COORDINATE_PRECISION=5"
>     FORMATOPTION "JSONP=%callback%"
>    END
> 
> Unfortunately calling:
> http://localhost:8082/wfs?SERVICE=WFS&VERSION=1.1.0&request=GetFeature&TYP
> ENAME=HU&outputformat=geojson&SRS=EPSG:3857&bbox=793732,6570204,793765,657
> 0228
> 
> gives me a result as before without your changes:
> {
> "type": "FeatureCollection",
> "crs": { "type": "name", "properties": { "name":
> "urn:ogc:def:crs:EPSG::3857" } },
> "features": [
> { "type": "Feature", "properties": { "gml_id": "", "UMRING_ID":
> "36245586"}, "geometry": { "type": "Polygon", "coordinates": [ [ [
> 793757.73417, 6570202.31642 ], [ 793762.85989, 6570195.63821 ], [
> 793770.20682, 6570201.30901 ], [ 793765.08276, 6570207.98411 ], [
> 793757.73417, 6570202.31642 ] ] ] } },
> { "type": "Feature", "properties": { "gml_id": "", "UMRING_ID":
> "36245583"}, "geometry": { "type": "Polygon", "coordinates": [ [ [
> 793752.31968, 6570224.89917 ], [ 793747.96097, 6570230.48534 ], [
> 793732.07033, 6570218.01607 ], [ 793740.12777, 6570207.69188 ], [
> 793742.99908, 6570209.94649 ], [ 793747.5696, 6570204.08902 ], [
> 793761.16105, 6570214.75134 ], [ 793752.94726, 6570225.27397 ], [
> 793752.31968, 6570224.89917 ] ] ] } },
> { "type": "Feature", "properties": { "gml_id": "", "UMRING_ID":
> "36245550"}, "geometry": { "type": "Polygon", "coordinates": [ [ [
> 793735.55884, 6570231.00753 ], [ 793738.78194, 6570226.81082 ], [
> 793746.26949, 6570232.5959 ], [ 793743.04798, 6570236.79266 ], [
> 793735.55884, 6570231.00753 ] ] ] } }
> ]
> }
> 
> I also tried this with an AJAX call from Javascript, giving me the
> exactly same result.
> 
> I get an error message trying to use the result in Leaflet telling me a
> ";" is missing. I assume it should look like this:
> 
> var testlayer = [{
> "type": "FeatureCollection",
> "crs": { "type": "name", "properties": { "name":
> "urn:ogc:def:crs:EPSG::3857" } },
> "features": [
> { "type": "Feature", "properties": { "gml_id": "", "UMRING_ID":
> "36245586"}, "geometry": { "type": "Polygon", "coordinates": [ [ [
> 793757.73417, 6570202.31642 ], [ 793762.85989, 6570195.63821 ], [
> 793770.20682, 6570201.30901 ], [ 793765.08276, 6570207.98411 ], [
> 793757.73417, 6570202.31642 ] ] ] } },
> { "type": "Feature", "properties": { "gml_id": "", "UMRING_ID":
> "36245583"}, "geometry": { "type": "Polygon", "coordinates": [ [ [
> 793752.31968, 6570224.89917 ], [ 793747.96097, 6570230.48534 ], [
> 793732.07033, 6570218.01607 ], [ 793740.12777, 6570207.69188 ], [
> 793742.99908, 6570209.94649 ], [ 793747.5696, 6570204.08902 ], [
> 793761.16105, 6570214.75134 ], [ 793752.94726, 6570225.27397 ], [
> 793752.31968, 6570224.89917 ] ] ] } },
> { "type": "Feature", "properties": { "gml_id": "", "UMRING_ID":
> "36245550"}, "geometry": { "type": "Polygon", "coordinates": [ [ [
> 793735.55884, 6570231.00753 ], [ 793738.78194, 6570226.81082 ], [
> 793746.26949, 6570232.5959 ], [ 793743.04798, 6570236.79266 ], [
> 793735.55884, 6570231.00753 ] ] ] } }
> ]
> }];
> 
> I'm not sure what is going on. Am I not applying the changes correctly
> or is my call wrong?
> 
> Thanks for you great support.
> 
> Best
> 
> Lars
> 
> 
> Am 09.01.2015 um 15:30 schrieb Eichner, Andreas - SID:
> > Hi,
> >
> > I've attached a quick'n dirty solution (against master). When applied to
> > mapogroutput.c you can set a JSONP formatoption to the callback name:
> >
> > OUTPUTFORMAT
> >      NAME 'geojson'
> >      DRIVER 'OGR/GEOJSON'
> >      MIMETYPE 'application/json; subtype=geojson; charset=utf-8'
> >      FORMATOPTION 'STORAGE=stream'
> >      FORMATOPTION 'FORM=simple'
> >      FORMATOPTION 'LCO:COORDINATE_PRECISION=5'
> >      FORMATOPTION 'JSONP=%callback%'
> > END
> >
> > This needs of course a WEB.VALIDATION:
> > WEB
> >    ...
> >    VALIDATION
> >      callback '.*'
> >    END
> > END
> >
> > Would be great if you can test if this works (looks good to me). The
> Devs might have a look if this could be integrated into master until OGR
> has an appropriate layer creation option (solution described by Even).
> >
> > Greetings
> >
> >> -----Ursprüngliche Nachricht-----
> >> Von: mapserver-users-bounces at lists.osgeo.org [mailto:mapserver-users-
> >> bounces at lists.osgeo.org] Im Auftrag von Lars Fricke
> >> Gesendet: Freitag, 9. Januar 2015 11:24
> >> An: mapserver-users at lists.osgeo.org
> >> Betreff: Re: [mapserver-users] Setting up a JSONP service
> >>
> >> Hello,
> >>
> >> first of all: Thank you for your support!
> >> Sorry for the late reply but I unfortunately was ill.
> >>
> >> @ Steve:
> >> I read about templating but also read that it is slower?
> >> I do not have a lot of experience in writing templates. Would you mind
> >> sharing a JSONP template?
> >>
> >> @ Even: Thank you for your thoughts. Who would implement that change
> >> though? I'm afraid I can't.
> >>
> >> @ Jeff: I followed those links but I only found threads referring to
> >> GeoServer or that were not related to my question. The GDAL page I did
> >> study and that's how I managed to set up the GeoJSON service but thats
> >> not the same unfortunately as it conflicts with the same origin policy.
> >>
> >> Best
> >>
> >> Lars
> >>
> >> Am 30.12.2014 um 16:24 schrieb Lime, Steve D (MNIT):
> >>> You can also use MapServer templates to accomplish this. It's a little
> >> more work since you have to write the template but it's quite flexible
> >> then. Usually I write the template to produce JSON and then use a
> simple
> >> wrapper template to produce JSONP. For example, jsonp.js looks like
> >> (callback is passed in):
> >>> // MapServer Template
> >>> [callback](
> >>>     [include src="templates/json.js"]
> >>> )
> >>>
> >>> Output formats look like:
> >>>
> >>>     OUTPUTFORMAT
> >>>       NAME 'JSON'
> >>>       DRIVER 'TEMPLATE'
> >>>       MIMETYPE 'application/json;'
> >>>       FORMATOPTION 'FILE=templates/json.js'
> >>>       FORMATOPTION 'ATTACHMENT=service.json'
> >>>     END
> >>>
> >>>     OUTPUTFORMAT
> >>>       NAME 'JSONP'
> >>>       DRIVER 'TEMPLATE'
> >>>       MIMETYPE 'application/json;'
> >>>       FORMATOPTION 'FILE=templates/jsonp.js'
> >>>       FORMATOPTION 'ATTACHMENT=service.json'
> >>>     END
> >>>
> >>> Steve
> >>>
> >>> -----Original Message-----
> >>> From:mapserver-users-bounces at lists.osgeo.org  [mailto:mapserver-users-
> >> bounces at lists.osgeo.org] On Behalf Of Lars Fricke
> >>> Sent: Monday, December 29, 2014 5:34 AM
> >>> To:mapserver-users at lists.osgeo.org
> >>> Subject: [mapserver-users] Setting up a JSONP service
> >>>
> >>> Dear List,
> >>>
> >>> I have a WFS service running under MapServer that I would like to
> >> operate as JSONP service. I managed to set GEOJSON as output format but
> I
> >> get "Cross-Origin-Request Blocked" if I try to call it with a
> Javascript
> >> client (using Leaflet L.layerJSON.
> >>> The question is: Is it possible to set up a JSONP service from
> Mapserver
> >> and if yes, how? My current mapfile looks like this (relevant parts):
> >>> "
> >>> # in WEB - METADATA
> >>> "wfs_getfeature_formatlist" "geojson,csv,ogrgml"
> >>>
> >>> OUTPUTFORMAT
> >>>       NAME "geojson"
> >>>       DRIVER "OGR/GEOJSON"
> >>>       MIMETYPE "application/json; subtype=geojson; charset=utf-8"
> >>>       FORMATOPTION "STORAGE=stream"
> >>>       FORMATOPTION "FORM=SIMPLE"
> >>>       FORMATOPTION "LCO:COORDINATE_PRECISION=5"
> >>>      END
> >>> "
> >>> If this would already be a correct JSONP service, I have to look on
> the
> >> Leaflet side for the error...
> >>> Thanks for your help.
> >>>
> >>> Cheers
> >>>
> >>> Lars
> >>> _______________________________________________
> >>> mapserver-users mailing list
> >>> mapserver-users at lists.osgeo.org
> >>> http://lists.osgeo.org/mailman/listinfo/mapserver-users
> >>> _______________________________________________
> >>> mapserver-users mailing list
> >>> mapserver-users at lists.osgeo.org
> >>> http://lists.osgeo.org/mailman/listinfo/mapserver-users
> >>>
> >> _______________________________________________
> >> mapserver-users mailing list
> >> mapserver-users at lists.osgeo.org
> >> http://lists.osgeo.org/mailman/listinfo/mapserver-users



More information about the mapserver-users mailing list