There are some catalog/factory create methods, but the only place I can find
LegendInfo really being used is in LayerInfo. The GetCapabilities actually uses
the LayerInfo.getLegend() for the defaultStyle. But I couldn't find anywhere
that sets it, so it always falls through as null anyway. The existing
LegendInfo class looks like what we need. It has onlineResource, format, width,
and height properties; all stuff for the GetCapabilities LegendURL. It kind of
looks like someone started down this path, but didn't go all the way.
The XStreamPersister was the right spot. I added two lines of code and got it
working (needed to set an alias and define a default implementation).
Right now I'm working on adding it to the Style web UI.
If you're curious I'm committing it to my GitHub account:
https://github.com/geocent-yancy/geoserver/commit/6362b5bd8f0625907a0e4c6443aac4a74286231b
I appreciate all your help.
Thanks,
Yancy Matherne
Software Developer
Geocent, LLC
111 Veterans Blvd., Suite 1600
Metairie, LA 70005
O: (504) 831-1900
E: [email protected]
http://www.geocent.com
________________________________
From: David Winslow [[email protected]]
Sent: Wednesday, October 03, 2012 8:03 AM
To: Yancy Matherne
Cc: Geoserver-devel
Subject: Re: [Geoserver-devel] GetLegendGraphic Enhancements
Hm, I didn't realize we already had a LegendInfo. Is it used elsewhere? We
might be writing ourselves into a corner if we start reusing the same class for
unrelated tasks.
The serialization is accomplished using XStream: http://xstream.codehaus.org/
They have a two-minute tutorial that covers the basics, I'd recommend going
through it.
The error message you're getting says:
Caused by: java.lang.InstantiationError: org.geoserver.catalog.LegendInfo
at sun.reflect.GeneratedSerializationConstructorAccessor4.newInstance(Unknown
Source)
That is, org.geoserver.catalog.LegendInfo doesn't have a default constructor
(in fact it has no constructors at all - it's an interface and so inherently
abstract.) So the problem seems to be that XStream is configured to serialize
legends without any information about which implementation class to use when
deserializing. I believe org.geoserver.config.util.XStreamPersister will need
to be modified to account for this, but even if it's not that's probably a good
place to start digging around.
--
David Winslow
OpenGeo - http://opengeo.org/
On Tue, Oct 2, 2012 at 7:24 PM, Yancy Matherne
<[email protected]<mailto:[email protected]>> wrote:
David,
Thank you for your quick reply. I agree with your comments, but have run into a
snag.
There already exists LegendInfo and LegendInfoImpl classes, so I figured I
would just use those. I added the LegendInfo as a property to the StyleInfo and
modified my test style.xml file.
<style>
<id>StyleInfoImpl--570ae188:124761b8d78:-7fe2</id>
<name>raster</name>
<filename>raster.sld</filename>
<legend>
<id>LegendInfoImpl--570ae188:124761b8d78:-7fe1</id>
<width>50</width>
<height>75</height>
<format>image/png</format>
<onlineResource>http://www.google.com/images/srpr/logo3w.png</onlineResource>
</legend>
</style>
Unfortunately, it is unable to construct the LegendInfo object when it is
loading the catalog.
Excerpt from log [see attached tomcat.log]:
...
Caused by: java.lang.InstantiationError: org.geoserver.catalog.LegendInfo
at sun.reflect.GeneratedSerializationConstructorAccessor4.newInstance(Unknown
Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at
com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider.newInstance(Sun14ReflectionProvider.java:74)
...
At this point, I'm not really sure how the XML parsing works, so I'm not sure
what the error means. I tried adding constructors with different arguments to
the LegendInfoImpl, but I get the same error. Do you have any ideas?
I was able to add the LegendInfo properties directly to the StyleInfo and just
create the LegendInfo object on the fly when StyleInfo.getLegend() is called.
Of course this isn't the way to do it, but I was at least able to prove that
the GetCapabilities will work as expected.
Thanks,
Yancy Matherne
Software Developer
Geocent, LLC
111 Veterans Blvd., Suite 1600
Metairie, LA 70005
O: (504) 831-1900<tel:%28504%29%20831-1900>
E: [email protected]<mailto:[email protected]>
http://www.geocent.com
________________________________
From: David Winslow [[email protected]<mailto:[email protected]>]
Sent: Tuesday, October 02, 2012 8:40 AM
To: Yancy Matherne
Cc: Geoserver-devel
Subject: Re: [Geoserver-devel] GetLegendGraphic Enhancements
LegendInfo could be embedded in the StyleInfo, and in fact this would happen
automatically if you simply make a LegendInfo class and add one as a property
of StyleInfo objects. Justin might disagree but I don't see any potential
drawbacks with this approach (unless it's useful to share legends between
styles - but it shouldn't be, right?)
As for having ShapePainter paint external legends, I think that I would use a
separate method rather than trying to wrap Legends as Styles somehow.
--
David Winslow
OpenGeo - http://opengeo.org/
On Mon, Oct 1, 2012 at 7:10 PM, Yancy Matherne
<[email protected]<mailto:[email protected]>> wrote:
Hi all,
We have a few weather observation layers that include many attributes, and we
use several TextSymbolizers with custom fonts, rotations, anchor points, etc.
to generate a complex icon that graphically represents several attributes'
values at the same time [see attached GetMap]. Unfortunately, the
GetLegendGraphic service does not generate a useful legend out of the box for
these styles [see attached GetLegendGraphic]. The icons for these layers are so
complex that a legend like
[http://visual.merriam-webster.com/images/earth/meteorology/station-model.jpg]
would be more useful than a vertical listing of the rules.
We are looking to patch GeoServer to do two things:
1) Point the LegendURL in the GetCapabilities to an ExternalGraphic.
2) Implement the LegendGraphic for Rules in SLD.
I have already started looking into each patch, and I think I have a general
approach to each.
1) Capabilities_1_3_0_Transformer.handleLegendURL() already takes a LegendInfo
parameter, but Capabilities_1_3_0_Transformer.handleStyles() always passes in
null. I was thinking we could add a LegendInfo to StyleInfo to persist the
ExternalGraphic information. But I'm not sure on the details of this. Would I
be able to put the LegendInfo directly into the StyleInfo XML file or would
there need to a separate file with references between them?
2) The LegendGraphic element in Rules is part of the SLD spec, but it does not
appear (to me) to be implemented in GeoServer. While using the debugger, in
BufferedImageLegendGraphicBuilder.buildLegendGraphic(), a LegendGraphic that is
included in your SLD is accessible by calling applicableRules[i].getLegend().
But that never happens in the actual code so it never gets used. I was looking
to just paint the GraphicLegend there, but the shapePainter.paint() method that
is used there takes a Style2D object and I haven't been able to figure out how
to convert a GraphicLegend to a Style2D object or perhaps use a different paint
method?
I think these would be useful additions for the whole community and I
appreciate any feedback or recommendations on this. Part of the tasking is to
commit this back to GeoServer source.
Thanks,
Yancy Matherne
Software Developer
Geocent, LLC
111 Veterans Blvd., Suite 1600
Metairie, LA 70005
O: (504) 831-1900<tel:%28504%29%20831-1900>
E: [email protected]<mailto:[email protected]>
http://www.geocent.com
------------------------------------------------------------------------------
Got visibility?
Most devs has no idea what their production app looks like.
Find out how fast your code is with AppDynamics Lite.
http://ad.doubleclick.net/clk;262219671;13503038;y?
http://info.appdynamics.com/FreeJavaPerformanceDownload.html
_______________________________________________
Geoserver-devel mailing list
[email protected]<mailto:[email protected]>
https://lists.sourceforge.net/lists/listinfo/geoserver-devel
------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
Geoserver-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geoserver-devel