[OpenLayers-Users] Re: minifying geojson data

Zac Spitzer zac.spitzer at gmail.com
Sun Sep 25 22:04:55 EDT 2011


simply enabling gzip/deflate compression works really well in
reducing the transfer size for geoJSON... I often see a 10x win

using the keymap is also a good approach and saves runtime
memory in the browser

On Mon, Sep 26, 2011 at 3:33 AM, Mr. Puneet Kishor <punk.kish at gmail.com>wrote:

> solved... see below (might be of use to others)
>
> On Sep 25, 2011, at 11:35 AM, Mr. Puneet Kishor wrote:
>
> > Right now I am creating a vector layer with features that are clickable,
> and show a popup window with the feature's attributes. My code is like so on
> the server side where I am selecting (fictitious) "meetings" from a database
> >
> >    while (meetings) {
> >        push @features, {
> >            type => "Feature",
> >            properties => {
> >                "long field1 name" => $field1,
> >                "long field2 name" => $field2,
> >                "long field3 name" => $field3
> >            },
> >            geometry => {
> >                type => "Point",
> >                coordinates => [$lng, $lat]
> >            }
> >        };
> >    }
> >    my %meetings = (
> >        meetings => {type => "FeatureCollection", features => \@features}
> >    );
> >    my $res = to_json \%meetings;
> >
> > and then, in the browser
> >
> >    // In my ajax call
> >    success: function(data) {
> >        var geojson_format = new OpenLayers.Format.GeoJSON();
> >        ..
> >        lyr.addFeatures(geojson_format.read(data["meetings"]));
> >
> >        lyr.events.on({
> >            "featureselected": onFeatureSelect,
> >            "featureunselected": onFeatureUnselect
> >        });
>
>
>
> pass additional data to the `onFeatureSelect` callback like so
>
>        lyr.events.on({
>            "featureselected": function(evt) {
>                 onFeatureSelect(evt, keymap);
>            },
>            "featureunselected": onFeatureUnselect
>        });
>
>
> and then, in the callback
>
>        // !onFeatureSelect(evt)
>        function onFeatureSelect(evt, keymap) {
>             feature = evt.feature;
>            var str = "";
>
>            for (var i in feature.attributes) {
>                 str += "<b>" + keymap[i] + ":</b> " + feature.attributes[i]
> + "<br />";
>            }
>
>            .. make popup window with str
>         };
>
>
> >    }
> >
> >
> >    function onFeatureSelect(evt) {
> >        var feature = evt.feature;
> >        var str = "";
> >        for (var i in feature.attributes) {
> >            str += "<b>" + i + ":</b> " + feature.attributes[i] + "<br
> />";
> >        }
> >
> >        popup = new OpenLayers.Popup.FramedCloud(.. using str ..);
> >        ..
> >        map.addPopup(popup, true);
> >    };
> >
> > This works great, but for a few thousand features, all those "long fields
> names" add up to a lot of wasteful data transfer. In the interest of
> reducing data transfer, I am hoping to implement a keymap for my attribute
> names (keys), and then send the keymap along with the new keys. Something
> like so on the server side (kinda like my own minification scheme) --
> >
> >    while (meetings) {
> >        push @features, {
> >            type => "Feature",
> >            properties => {
> >                a => $field1,
> >                b => $field2,
> >                c => $field3
> >            },
> >            geometry => {
> >                type => "Point",
> >                coordinates => [$lng, $lat]
> >            }
> >        };
> >    }
> >    my %meetings = (
> >        keymap => {
> >            a => "long field1 name",
> >            b => "long field2 name",
> >            c => "long field3 name"
> >        },
> >        meetings => {type => "FeatureCollection", features => \@features}
> >    );
> >    my $res = to_json \%meetings;
> >
> > But, I am at a loss as to how to modify my JavaScript code to use this
> keymap. `evt.feature` seems to have an "attributes" key that has been
> automatically mapped to the "properties" key sent from the server. How do I
> get the data.keymap to my onFeatureSelect(evt) callback?
>
> _______________________________________________
> Users mailing list
> Users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/openlayers-users
>



-- 
Zac Spitzer
Solution Architect / Director
Ennoble Consultancy Australia
http://www.ennoble.com.au
http://zacster.blogspot.com
+61 405 847 168
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/openlayers-users/attachments/20110926/3f41f7f0/attachment.html


More information about the Users mailing list