<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>geoserver-gis &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/geoserver-gis/</link>
	<description>Feed of posts on WordPress.com tagged "geoserver-gis"</description>
	<pubDate>Tue, 21 May 2013 07:14:59 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[OpenLayers, GeoExt, GeoServer, and GetFeatureInfo]]></title>
<link>http://smathermather.wordpress.com/2012/05/06/openlayers-geoext-geoserver-and-getfeatureinfo/</link>
<pubDate>Sun, 06 May 2012 05:00:21 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/05/06/openlayers-geoext-geoserver-and-getfeatureinfo/</guid>
<description><![CDATA[I wrote an earlier post on using GetFeatureInfo through OpenLayers to bring back a formatted html do]]></description>
<content:encoded><![CDATA[<p>I wrote an <a href="https://smathermather.wordpress.com/2011/08/20/postgresql-views-within-geoserver-getfeatureinfo-with-freemarker-templates-etc/">earlier post on using GetFeatureInfo through OpenLayers to bring back a formatted html document </a>with pictures, and formated tables, etc.  It wasn&#8217;t sophisticated, but got the job done.  Since around that time, as I&#8217;ve been building out our services, the speed with which a GetFeatureInfo request returns has g o t t  e  n  p    r     o     g       r       e        s         s            i             v              e             l            y     slower, to the point where the feature is essentially unusable.  Why?  Poor client coding.  Here&#8217;s my getfeatureinfo codeblock for OpenLayers:</p>
<pre class="brush: jscript; title: ; notranslate" title="">

////// WMS GetFeatureInfo
var info = new OpenLayers.Control.WMSGetFeatureInfo({
             drillDown : false,
queryVisible : true,
panMapIfOutOfView : false,
             url : GeoserverWMS,
layerUrls : [GeowebcacheURL],
eventListeners : {
getfeatureinfo : function (event) {
popup = new OpenLayers.Popup.FramedCloud(
                             &#34;popinfo&#34;,
map.getLonLatFromPixel(event.xy),
null,
event.text,
null,
                             true);
map.addPopup(popup, true);
}
}
});

map.addControl(info);
info.activate();

//  end of popup code

</pre>
<div>The problem?  This code will query all visible layers.   Lots of visible layers results in a GetFeatureInfo request that looks like this:</div>
<div>
<pre class="brush: plain; title: ; notranslate" title="">
localhost:8080/geoserver/wms?&#38;SERVICE=WMS&#38;VERSION=1.1.1&#38;REQUEST=GetFeatureInfo&#38;LAYERS=summer_aerial_2,summer_aerial_1,reservation_boundaries_public_private_cm_dissolved_mask_gradien,odot_interstate,odot_us_routes,odot_state_routes,reservation_bounds,detailed_hydro_view,cm_bridge_view,cm_trails,impervious_update,cm_buildings,cm_buildings_outline,golf_view,nhd_lake_erie,supplementary_shields,planet_osm_line,cuyahoga_street_centerlines_labels,planet_osm_line_outside_cuy,detailed_hydro_labels,facilities_cm,facility_areas_cm&#38;QUERY_LAYERS=summer_aerial_2,summer_aerial_1,reservation_boundaries_public_private_cm_dissolved_mask_gradien,odot_interstate,odot_us_routes,odot_state_routes,reservation_bounds,detailed_hydro_view,cm_bridge_view,cm_trails,impervious_update,cm_buildings,cm_buildings_outline,golf_view,nhd_lake_erie,supplementary_shields,planet_osm_line,cuyahoga_street_centerlines_labels,planet_osm_line_outside_cuy,detailed_hydro_labels,facilities_cm,facility_areas_cm&#38;STYLES=,,,,,,,,,,,,,,,,,,,,,&#38;BBOX=2232424.250515%2C625357.428203%2C2233363.463113%2C625592.231353&#38;FEATURE_COUNT=10&#38;HEIGHT=213&#38;WIDTH=852&#38;FORMAT=image%2Fpng&#38;INFO_FORMAT=text%2Fhtml&#38;SRS=EPSG%3A3734&#38;X=320&#38;Y=91
</pre>
</div>
<div>My naive attempts to fix this were simply adding a layers key/value pair, e.g.:</p>
<pre class="brush: jscript; title: ; notranslate" title="">
////// WMS GetFeatureInfo
     var info = new OpenLayers.Control.WMSGetFeatureInfo({
drillDown : false,
queryVisible : true,
panMapIfOutOfView : false,
             url : GeoserverWMS,
layers : [reservation_bounds],
layerUrls : [GeowebcacheURL],
eventListeners : {
getfeatureinfo : function (event) {
                     popup = new OpenLayers.Popup.FramedCloud(
                             &#34;popinfo&#34;,
map.getLonLatFromPixel(event.xy),
null,
event.text,
null,
                             true);
map.addPopup(popup, true);
}
}
});

map.addControl(info);
info.activate();

//  end of popup code
</pre>
</div>
<div></div>
<div>&#8230; but for whatever reason, maybe the way I instantiated the OpenLayers.Layer.WMS instances using Ext.each (ahem, the way I modified a vendor&#8217;s cleverly written code&#8230;), the layers aren&#8217;t recognized as objects by the name I might expect.  So, I hack and create a duplicate layer by a different name.  I&#8217;ll have a non-hack version here soon (I hope) which will use the existing array of WMS instances, loop through them, and only add the appropriate ones to the layers array.  In the mean time, this should work.</div>
<div>
<pre class="brush: jscript; title: ; notranslate" title="">
var reservation_bounds = new OpenLayers.Layer.WMS(&#34;Reservation Boundaries&#34;, GeoserverWMS,
{'layers': 'base:reservation_bounds', transparent: true, format: 'image/png'},
             {isBaseLayer: false}
);

////// WMS GetFeatureInfo
var info = new OpenLayers.Control.WMSGetFeatureInfo({
drillDown : false,
queryVisible : true,
panMapIfOutOfView : false,
             url : GeoserverWMS,
layers : [reservation_bounds],
layerUrls : [GeowebcacheURL],
eventListeners : {
getfeatureinfo : function (event) {
popup = new OpenLayers.Popup.FramedCloud(
                             &#34;popinfo&#34;,
map.getLonLatFromPixel(event.xy),
null,
event.text,
null,
                             true);
map.addPopup(popup, true);
}
}
});

map.addControl(info);
info.activate();

//  end of popup code
</pre>
</div>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Building simple clients for MapFish -- cURL as a client]]></title>
<link>http://smathermather.wordpress.com/2012/04/25/building-simple-clients-for-mapfish-curl-as-a-client/</link>
<pubDate>Wed, 25 Apr 2012 22:26:49 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/04/25/building-simple-clients-for-mapfish-curl-as-a-client/</guid>
<description><![CDATA[I have two previous posts on using MapFish (in this case, the GeoServer version) to allow for printi]]></description>
<content:encoded><![CDATA[<p>I have <a href="http://smathermather.wordpress.com/category/gis/mapfish/">two previous posts</a> on using MapFish (in this case, the GeoServer version) to allow for printing to hi-resolution PDF maps from the browser.  Here we use a command-line browser (<a href="http://curl.haxx.se/">cURL</a>) to post our json to the MapFish service in order to retrieve our PDF.</p>
<p>I did not keep any notes from before on making json posts to the MapFish server as a means by which to test any manual configuration of the json file, so I had to rediscover this approach from <a href="http://blogs.plexibus.com/2009/01/15/rest-esting-with-curl/">pages like this.</a></p>
<p>The &#8220;@&#8221; sign below is so that curl knows I&#8217;m feeding it a file instead of the actual json to post:</p>
<pre class="brush: bash; title: ; notranslate" title="">

curl -i -H &#34;Accept: application/json&#34; -H &#34;Content-Type: application/json&#34; -X POST --data @mapfish_landscape.json http://localhost:8080/geoserver/pdf/create.json

</pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Building simple clients for MapFish -- Beginnings of a PL/pgSQL function]]></title>
<link>http://smathermather.wordpress.com/2012/03/10/building-simple-clients-for-mapfish-beginnings-of-a-plpsql-function/</link>
<pubDate>Sun, 11 Mar 2012 01:17:39 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/03/10/building-simple-clients-for-mapfish-beginnings-of-a-plpsql-function/</guid>
<description><![CDATA[I&#8217;ve had a couple of other posts (1 and 2 and 3 and) on simple clients for MapFish.  I like th]]></description>
<content:encoded><![CDATA[<p>I&#8217;ve had a couple of other posts (<a href="http://smathermather.wordpress.com/2012/02/08/ditching-geoext-building-simple-clients-for-mapfish/">1 and</a> <a href="http://smathermather.wordpress.com/2012/02/10/building-simple-clients-for-mapfish-underlying-infrastructure/">2 and</a> <a href="http://smathermather.wordpress.com/2012/03/08/musings-on-postgis-driven-mapfish-requests-code-only/">3 and</a>) on simple clients for MapFish.  I like the client server infrastructure for MapFish&#8211; with the client end of things built up in GeoExt, it makes for a really elegant combo.  But I&#8217;d like articulate my vision for simple clients for MapFish a little further.  One thing that seems quite feasible is to embed the JSON for the MapFish requests in a PostgreSQL table.  Why there and not just within our client?  Well, we can use PostGIS to construct really clever multi-page prints if we want to, build into PostGIS the logic to decide the orientation, number of pages, scale, and other information needed to decide how best to print this object, and we can access that JSON through a GetFeatureInfo Request through any WMS compliant server (e.g. GeoServer).  In this way, we can use the GetFeatureInfo bubble as a place where we have links (enhanced with a little javascript) to post the JSON to our MapFish service and return a PDF.</p>
<p>Any object we want exposed through our interface could have a link associated with it that generates a pdf map of that object.  Let&#8217;s start with the functionality we want in our PostgreSQL function and figure out what it needs to generate the JSON we want. Here&#8217;s what we want our JSON to look like, at least for a very simple example:</p>
<pre class="brush: jscript; title: ; notranslate" title="">
{
	&#34;units&#34; : &#34;ft&#34;,
	&#34;srs&#34; : &#34;EPSG:3734&#34;,
	&#34;layout&#34; : &#34;1) LETTER 8.5x11 Portrait&#34;,
	&#34;dpi&#34; : 300,
	&#34;serviceParams&#34; : {
		&#34;locale&#34; : &#34;en_US&#34;
	},
	&#34;resourcesUrl&#34; : &#34;http://maps/geoserver/www/printing&#34;,
	&#34;layersMerging&#34; : true,
	&#34;preferredIntervalFractions&#34; : [0.1, 0.2, 0.4],
	&#34;metaTitle&#34; : &#34;Title Here Please! GIS Print&#34;,
	&#34;metaAuthor&#34; : &#34;Title Here Please!&#34;,
	&#34;metaSubject&#34; : &#34;Title Here Please! GIS Print&#34;,
	&#34;metaKeywords&#34; : &#34;&#34;,
	&#34;outputFilename&#34; : &#34;cm_gis&#34;,
	&#34;legends&#34; : [],
	&#34;layers&#34; : [{
			&#34;baseURL&#34; : &#34;http://maps/geoserver/wms?&#34;,
			&#34;opacity&#34; : 1,
			&#34;singleTile&#34; : false,
			&#34;type&#34; : &#34;WMS&#34;,
			&#34;layers&#34; : [&#34;cuy_bridge_decks&#34;, &#34;planet_osm_line_outside_cuy_map&#34;, &#34;cuy_roads_poly&#34;, &#34;cuy_street_centerlines&#34;, &#34;reservation_bounds_solid&#34;],
			&#34;format&#34; : &#34;image/png&#34;,
			&#34;styles&#34; : [&#34;&#34;],
			&#34;customParams&#34; : {
				&#34;TILED&#34; : &#34;false&#34;,
				&#34;TRANSPARENT&#34; : true
			}
		}
	],
	&#34;pages&#34; : [{
			&#34;center&#34; : [2160649.7795275, 597547.8687664],
			&#34;scale&#34; : 6000,
			&#34;rotation&#34; : 0,
			&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
		}
	]
}
</pre>
<p>As a starting point, we can split this into two sections, the global parameters, i.e. everything except &#8220;pages&#8221; (pages is what we want postgis to calculate for us).  In the most generic sense, we would want to pass all of the parameters in the global section to the function, plus the geometry of the object over which we want to print the extent, plus the actual print size of the printable area for the desired layout have it return the json, with a population of pages section done by a little PostGIS magic. PL/pgSQL to come&#8230; .</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mapfish Play cont. Musings on PostGIS driven Mapfish requests-- Code only]]></title>
<link>http://smathermather.wordpress.com/2012/03/08/musings-on-postgis-driven-mapfish-requests-code-only/</link>
<pubDate>Fri, 09 Mar 2012 02:29:12 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/03/08/musings-on-postgis-driven-mapfish-requests-code-only/</guid>
<description><![CDATA[Code only post-- which only means it's been out here not-quite ready to post for a month. Now I post]]></description>
<content:encoded><![CDATA[<pre>Code only post-- which only means it's been out here not-quite ready to post for a month.  Now I post out of shear annoyance with myself... .
<pre class="brush: sql; title: ; notranslate" title="">
SELECT '{&#34;units&#34;:&#34;ft&#34;,&#34;srs&#34;:&#34;EPSG:3734&#34;,&#34;layout&#34;:&#34;1) LETTER 8.5x11 Portrait&#34;,&#34;dpi&#34;:300,&#34;serviceParams&#34;:{&#34;locale&#34;:&#34;en_US&#34;},&#34;resourcesUrl&#34;:&#34;http://maps/geoserver/www/printing&#34;,&#34;layersMerging&#34;:true,&#34;preferredIntervalFractions&#34;:[0.1,0.2,0.4],&#34;metaTitle&#34;:&#34;GIS Print&#34;,&#34;metaAuthor&#34;:&#34;&#34;,&#34;metaSubject&#34;:&#34;GIS Print&#34;,&#34;metaKeywords&#34;:&#34;&#34;,&#34;outputFilename&#34;:&#34;cm_gis&#34;,&#34;legends&#34;:[{&#34;name&#34;:&#34;&#34;,&#34;classes&#34;:[{&#34;name&#34;:&#34;Reservation&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=reservation_bounds&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=unrestricted&#34;]},{&#34;name&#34;:&#34;Restricted&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=reservation_bounds&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=restricted&#34;]}]},{&#34;name&#34;:&#34;Detailed Hydro&#34;,&#34;classes&#34;:[{&#34;name&#34;:&#34;Ditch&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=cm_streams_ditch&#34;]},{&#34;name&#34;:&#34;Non-Stream Waterway&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=cm_streams_ditch&#34;]},{&#34;name&#34;:&#34;Stream&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=cm_streams_stream&#34;]},{&#34;name&#34;:&#34;Stream or River&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=Stream%20or%20River&#34;]},{&#34;name&#34;:&#34;Pond&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=Pond&#34;]},{&#34;name&#34;:&#34;Lake Erie&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=Lake&#34;]},{&#34;name&#34;:&#34;Other Wet Areas&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=detailed_hydro_view&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=Other%20Wet%20Areas&#34;]}]},{&#34;name&#34;:&#34;Trails&#34;,&#34;classes&#34;:[{&#34;name&#34;:&#34;ADA, APT&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=cm_trails&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=rule01&#34;]},{&#34;name&#34;:&#34;Bridle&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=cm_trails&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=rule02&#34;]},{&#34;name&#34;:&#34;Hiking&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=cm_trails&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=rule03&#34;]},{&#34;name&#34;:&#34;Mountain Bike Trails&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=cm_trails&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=rule04&#34;]},{&#34;name&#34;:&#34;Connector Trail&#34;,&#34;icons&#34;:[&#34;http://maps/geoserver/wms?&#38;VERSION=1.1.0&#38;REQUEST=GetLegendGraphic&#38;LAYER=cm_trails&#38;HEIGHT=10&#38;WIDTH=10&#38;FORMAT=image%2Fpng&#38;TRANSPARENT=true&#38;LEGEND_OPTIONS=forceLabels%3Afalse&#38;EXCEPTIONS=application%2Fvnd.ogc.se_xml&#38;RULE=rule05&#34;]}]}],&#34;layers&#34;:[{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;cuy_bridge_decks&#34;,&#34;planet_osm_line_outside_cuy_map&#34;,&#34;cuy_roads_poly&#34;,&#34;cuyahoga_street_centerlines&#34;,&#34;reservation_bounds_solid&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TILED&#34;:&#34;false&#34;,&#34;TRANSPARENT&#34;:true}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;reservation_bounds&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TRANSPARENT&#34;:true,&#34;TILED&#34;:false}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;detailed_hydro_view&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TRANSPARENT&#34;:true,&#34;TILED&#34;:false}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;cm_bridge_view&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TRANSPARENT&#34;:true,&#34;TILED&#34;:false}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;cm_trails&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TRANSPARENT&#34;:true,&#34;TILED&#34;:false}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;impervious_update&#34;,&#34;cm_buildings&#34;,&#34;cm_buildings_outline&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TILED&#34;:&#34;false&#34;,&#34;TRANSPARENT&#34;:true}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;golf_view&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TILED&#34;:&#34;false&#34;,&#34;TRANSPARENT&#34;:true}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;nhd_lake_erie&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TILED&#34;:&#34;false&#34;,&#34;TRANSPARENT&#34;:true}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:false,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;reservation_boundaries_public_private_cm_dissolved_mask_gradien&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TILED&#34;:&#34;false&#34;,&#34;TRANSPARENT&#34;:true}},{&#34;baseURL&#34;:&#34;http://maps/geoserver/wms?&#34;,&#34;opacity&#34;:1,&#34;singleTile&#34;:true,&#34;type&#34;:&#34;WMS&#34;,&#34;layers&#34;:[&#34;supplementary_shields&#34;,&#34;odot_interstate&#34;,&#34;odot_us_routes&#34;,&#34;odot_state_routes&#34;,&#34;planet_osm_line&#34;,&#34;cuyahoga_street_centerlines_labels&#34;,&#34;planet_osm_line_outside_cuy&#34;,&#34;detailed_hydro_labels&#34;,&#34;facilities_cm&#34;,&#34;facility_areas_cm&#34;],&#34;format&#34;:&#34;image/png&#34;,&#34;styles&#34;:[&#34;&#34;],&#34;customParams&#34;:{&#34;TILED&#34;:&#34;false&#34;,&#34;TRANSPARENT&#34;:true}}],&#34;pages&#34;:[{&#34;center&#34;:[' &#124;&#124; ST_X(ST_Centroid(the_geom)) &#124;&#124; ',' &#124;&#124; ST_Y(ST_Centroid(the_geom)) &#124;&#124; '],&#34;scale&#34;:2400,&#34;rotation&#34;:0,&#34;mapTitle&#34;:&#34;&#34;}]}'::text
FROM loops
WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#60; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
AND
(ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom))) &#60; 7900
</pre>
<pre class="brush: sql; title: ; notranslate" title="">
SELECT 'landscape, linear follow'::text, ST_Centroid(the_geom)
	FROM loops
		WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#62; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
			AND
		(ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#62; 15800

UNION ALL

SELECT 'landscape, quad page'::text, ST_Centroid(the_geom)
	FROM loops
		WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#62; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
			AND
		(ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#62; 7900
			AND
		(ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#60;= 15800

UNION ALL

SELECT 'landscape, single page'::text, ST_Centroid(the_geom)
	FROM loops
		WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#62; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
			AND
		(ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#60; 7900

UNION ALL

SELECT 'portrait, quad page'::text, ST_Centroid(the_geom)
	FROM loops
		WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#60; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
			AND
		(ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom))) &#62; 7900
			AND
		(ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom))) &#60;= 15800

UNION ALL

SELECT 'portrait, single page'::text, ST_Centroid(the_geom)
	FROM loops
		WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#60; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
			AND
		(ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom))) &#60; 7900

UNION ALL

SELECT 'portrait, linear follow'::text, ST_Centroid(the_geom)
	FROM loops
		WHERE (ST_XMax(ST_Envelope(the_geom)) - ST_XMin(ST_Envelope(the_geom))) &#60; (ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom)))
			AND
		(ST_YMax(ST_Envelope(the_geom)) - ST_YMin(ST_Envelope(the_geom))) &#62; 15800
;

</pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[#OGC Web Services and #Security]]></title>
<link>http://smathermather.wordpress.com/2012/03/06/ogc-web-services-and-security-2/</link>
<pubDate>Wed, 07 Mar 2012 04:17:39 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/03/06/ogc-web-services-and-security-2/</guid>
<description><![CDATA[A while back, I had a (somewhat cryptic) post on OGC services and security.  A couple months later,]]></description>
<content:encoded><![CDATA[<p>A while back, I had a (<a href="https://smathermather.wordpress.com/2011/10/05/ogc-web-services-and-security/">somewhat cryptic) post</a> on OGC services and security.  A couple months later,<a href="http://geo-solutions.blogspot.com/2010/12/developers-corner-improving-geoserver.html"> I saw this post on GeoSolution&#8217;s</a> site on GeoServer security and the ins and outs of various options, from native to proxied security.  It is quite a bit more nuanced than my own&#8230; .  I recommend you read it, even if you don&#8217;t use GeoServer&#8211; it is enlightening about the specific problems of securing spatial data that go beyond the simple authentication/authorization models that apply to most other datasets.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Building simple clients for MapFish -- Underlying Infrastructure]]></title>
<link>http://smathermather.wordpress.com/2012/02/10/building-simple-clients-for-mapfish-underlying-infrastructure/</link>
<pubDate>Fri, 10 Feb 2012 05:12:47 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/02/10/building-simple-clients-for-mapfish-underlying-infrastructure/</guid>
<description><![CDATA[In order to build simple clients for the MapFish print service, we have to understand what the proto]]></description>
<content:encoded><![CDATA[<p>In order to <a href="http://smathermather.wordpress.com/2012/02/08/ditching-geoext-building-simple-clients-for-mapfish/">build simple clients for the MapFish print service</a>, we have to understand what the protocols are that are invoked and how they function.  To do this we can read the <a href="http://trac.mapfish.org/trac/mapfish/wiki/PrintModuleDoc">MapFish Print Module Doc</a>, and then modify and vamp from there.  While I was going to joke that this would be an excellent cure for insomnia, the joke fell apart when I actually read the <a href="http://trac.mapfish.org/trac/mapfish/wiki/PrintModuleDoc">Print Module Doc</a>, and it was clear, concise, readable, and frankly at least as interesting as most of my blog entries (no comments here please).</p>
<p>But, I did that after the fact.  In other words, I did it the hard way&#8211; just like you do when you bring home that really cool electronic toy, and play with it for a couple hours before (maybe, if ever) picking up the manual.  So for me, instead of reading the excellent documentation, I sniffed the protocol using a <a href="http://geoext.org/">GeoExt interface</a> to a <a href="http://geoserver.org">GeoServer</a>/<a href="http://mapfish.org/">MapFish</a> combo with <a href="http://getfirebug.com/">Firebug</a>.  (quick aside&#8211; if you write web stuff and are new to it, then you should know you should use Firebug to write it better and test it on the fly&#8211; or if you&#8217;re a cool kid with horn-rimmed glasses and an ironic t-shirt, do it in Google Chrome&#8217;s Javascript Console, it makes no real difference as far as outcomes, just a difference in style).</p>
<p>In sniffing the protocol, I saw that my request for a PDF was a <a href="http://en.wikipedia.org/wiki/POST_%28HTTP%29">POST</a> request to the server, with a <a href="http://www.json.org/">JSON</a> object as the request.  In short, the interface converts my form information into a bunch of text (a javascript object) which it pushes to the server.  The server location in this case is: <a href="http://localhost:8080/geoserver/pdf/create.json. " rel="nofollow">http://localhost:8080/geoserver/pdf/create.json. </a> The text it&#8217;s pushing is a file which reads something like this:</p>
<pre class="brush: jscript; title: ; notranslate" title="">
{
	&#34;units&#34; : &#34;ft&#34;,
	&#34;srs&#34; : &#34;EPSG:3734&#34;,
	&#34;layout&#34; : &#34;1) LETTER 8.5x11 Portrait&#34;,
	&#34;dpi&#34; : 300,
	&#34;serviceParams&#34; : {
		&#34;locale&#34; : &#34;en_US&#34;
	},
	&#34;resourcesUrl&#34; : &#34;http://maps/geoserver/www/printing&#34;,
	&#34;layersMerging&#34; : true,
	&#34;preferredIntervalFractions&#34; : [0.1, 0.2, 0.4],
	&#34;metaTitle&#34; : &#34;Title Here Please! GIS Print&#34;,
	&#34;metaAuthor&#34; : &#34;Title Here Please!&#34;,
	&#34;metaSubject&#34; : &#34;Title Here Please! GIS Print&#34;,
	&#34;metaKeywords&#34; : &#34;&#34;,
	&#34;outputFilename&#34; : &#34;cm_gis&#34;,
	&#34;legends&#34; : [],
	&#34;layers&#34; : [{
			&#34;baseURL&#34; : &#34;http://maps/geoserver/wms?&#34;,
			&#34;opacity&#34; : 1,
			&#34;singleTile&#34; : false,
			&#34;type&#34; : &#34;WMS&#34;,
			&#34;layers&#34; : [&#34;cuy_bridge_decks&#34;, &#34;planet_osm_line_outside_cuy_map&#34;, &#34;cuy_roads_poly&#34;, &#34;cuyahoga_street_centerlines&#34;, &#34;reservation_bounds_solid&#34;],
			&#34;format&#34; : &#34;image/png&#34;,
			&#34;styles&#34; : [&#34;&#34;],
			&#34;customParams&#34; : {
				&#34;TILED&#34; : &#34;false&#34;,
				&#34;TRANSPARENT&#34; : true
			}
		}
	],
	&#34;pages&#34; : [{
			&#34;center&#34; : [2160649.7795275, 597547.8687664],
			&#34;scale&#34; : 6000,
			&#34;rotation&#34; : 0,
			&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
		}
	]
}

</pre>
<p>I&#8217;ll call your attention to the last little bit of code in the object:</p>
<pre class="brush: jscript; title: ; notranslate" title="">

&#34;pages&#34; : [{
		&#34;center&#34; : [2160649.7795275, 597547.8687664],
		&#34;scale&#34; : 6000,
		&#34;rotation&#34; : 0,
		&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
	}

]
</pre>
<p>I was proud of myself for recognizing (through the haze of a guy who&#8217;s modified a lot of javascript, but never learned it proper-like) that this is a javascript array with just one object.  Which means, we can make it an array with more than one object.  Eureka!  multi-page pdfs with just 5-6 more lines of code:</p>
<pre class="brush: jscript; title: ; notranslate" title="">

&#34;pages&#34; : [{
		&#34;center&#34; : [2160649.7795275, 597547.8687664],
		&#34;scale&#34; : 6000,
		&#34;rotation&#34; : 0,
		&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
	}, {
		&#34;center&#34; : [2216902.0734907, 596701.84251968],
		&#34;scale&#34; : 1800,
		&#34;rotation&#34; : 0,
		&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
	}
]

</pre>
<p>Now, just to figure out how to test this out without building a web page to do it.  <a href="http://curl.haxx.se/">curl</a> is our friend here, just a few extra flags for telling the server what we are doing with the json file (thanks to <a href="http://vinhboy.com/blog/2011/09/08/example-curl-json-post/">this post</a>):</p>
<pre class="brush: plain; title: ; notranslate" title="">
curl -i -H &#34;Accept: application/json&#34; -H &#34;Content-Type: application/json&#34; -X POST -d @test.json http://localhost:8080/geoserver/pdf/create.json

</pre>
<p>And now for all the json fit to print:</p>
<pre class="brush: jscript; title: ; notranslate" title="">
{
	&#34;units&#34; : &#34;ft&#34;,
	&#34;srs&#34; : &#34;EPSG:3734&#34;,
	&#34;layout&#34; : &#34;1) LETTER 8.5x11 Portrait&#34;,
	&#34;dpi&#34; : 300,
	&#34;serviceParams&#34; : {
		&#34;locale&#34; : &#34;en_US&#34;
	},
	&#34;resourcesUrl&#34; : &#34;http://maps/geoserver/www/printing&#34;,
	&#34;layersMerging&#34; : true,
	&#34;preferredIntervalFractions&#34; : [0.1, 0.2, 0.4],
	&#34;metaTitle&#34; : &#34;Title Here Please! GIS Print&#34;,
	&#34;metaAuthor&#34; : &#34;Title Here Please!&#34;,
	&#34;metaSubject&#34; : &#34;Title Here Please! GIS Print&#34;,
	&#34;metaKeywords&#34; : &#34;&#34;,
	&#34;outputFilename&#34; : &#34;cm_gis&#34;,
	&#34;legends&#34; : [],
	&#34;layers&#34; : [{
			&#34;baseURL&#34; : &#34;http://maps/geoserver/wms?&#34;,
			&#34;opacity&#34; : 1,
			&#34;singleTile&#34; : false,
			&#34;type&#34; : &#34;WMS&#34;,
			&#34;layers&#34; : [&#34;cuy_bridge_decks&#34;, &#34;planet_osm_line_outside_cuy_map&#34;, &#34;cuy_roads_poly&#34;, &#34;cuyahoga_street_centerlines&#34;, &#34;reservation_bounds_solid&#34;],
			&#34;format&#34; : &#34;image/png&#34;,
			&#34;styles&#34; : [&#34;&#34;],
			&#34;customParams&#34; : {
				&#34;TILED&#34; : &#34;false&#34;,
				&#34;TRANSPARENT&#34; : true
			}
		}
	],
	&#34;pages&#34; : [{
			&#34;center&#34; : [2160649.7795275, 597547.8687664],
			&#34;scale&#34; : 6000,
			&#34;rotation&#34; : 0,
			&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
		}, {
			&#34;center&#34; : [2216902.0734907, 596701.84251968],
			&#34;scale&#34; : 1800,
			&#34;rotation&#34; : 0,
			&#34;mapTitle&#34; : &#34;Title Here Please!&#34;
		}
	]
}

</pre>
<p>*Updated with better formatted sourcecode, thanks to notepad++&#8217;s JSMin plugin</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Ditching GeoExt-- building simple clients for MapFish]]></title>
<link>http://smathermather.wordpress.com/2012/02/08/ditching-geoext-building-simple-clients-for-mapfish/</link>
<pubDate>Thu, 09 Feb 2012 04:15:22 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2012/02/08/ditching-geoext-building-simple-clients-for-mapfish/</guid>
<description><![CDATA[I&#8217;ve been enamored with the GeoExt interface for grabbing MapFish based print services since I]]></description>
<content:encoded><![CDATA[<p>I&#8217;ve been enamored with the GeoExt interface for grabbing MapFish based print services since I first saw it.  It&#8217;s a slick little interface, and can even been extended for multi-page print layouts pretty easily, ala <a href="http://tinyurl.com/mapfishmultipageprint">http://tinyurl.com/mapfishmultipageprint</a>.  But as I&#8217;ve started to give thought not to what an organization full of professionals needs but what a public interface should looks (and probably those interfaces for professional organizations as well, only they tend to be more tolerant of poor design&#8230;), I&#8217;ve begun to realize that there are some clever ways we can bypass the GeoExt interface for generating the print documents at all.  The actual request for a document is a simple post with a JSON object that has certain properties.  We can construct this object all sorts of ways.</p>
<p>So, in the interest of making the snake eat its tail, my objective over the next few posts is to create an entry in a PostGIS database that has a view that automatically parses the &#8220;best&#8221; multi-page print for the geometry, feeds that back like a good API to the client script, which then requests a pdf print based on those criteria through the GeoServer Mapfish extension.  Are we clear as <a href="http://www.thefreedictionary.com/MUD">a computer program, usually running over the Internet, that allows multiple users to participate in virtual-reality role-playing games</a>?  Good.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Leaflet, GeoServer, and Open Source Software Ramblings]]></title>
<link>http://smathermather.wordpress.com/2011/12/06/leaflet-geoserver-and-open-source-software-ramblings/</link>
<pubDate>Wed, 07 Dec 2011 01:39:28 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/12/06/leaflet-geoserver-and-open-source-software-ramblings/</guid>
<description><![CDATA[&lt;gushing&gt; I posted this post about an apparent problem in rendering of GeoJSON in Leaflet, and]]></description>
<content:encoded><![CDATA[<pre class="brush: xml; title: ; notranslate" title="">
&#60;gushing&#62;
</pre>
<p>I posted <a href="http://smathermather.wordpress.com/2011/11/28/cartodb-leaflet-and-a-little-anti-generalization/">this post</a> about an apparent problem in rendering of GeoJSON in Leaflet, and now it&#8217;s fixed a week later.  Why gush now, when for a few years developers on the GeoServer board have been fixing bugs I&#8217;ve found (often by the next day)?  Well for one, I very rarely find bugs in GeoServer&#8211; I just think I do, document everything, send it on, and then find out I&#8217;ve made a mistake.  It&#8217;s hard to gush about making a mistake and then having the GeoServer community kind enough to show me the errors (and they are kind about it).  I should gush anyway, but ego sometimes prevents it.  For example, the last time I found a &#8220;bug&#8221; in GeoServer, one of the developers fixed it so no one else could make the same mistake (the mistake included forgetting to install fonts) and did it while laid up with an injury.</p>
<p>With Leaflet, I guess what&#8217;s really nice is the kindness of strangers, so it comes as a surprise.  The GeoServer listserve has come to feel like family.  They take great care of me and I take them for granted.  I don&#8217;t know the Leaflet developers from Adam, so it feels quite warm and fuzzy to have <del datetime="2011-12-07T10:59:54+00:00">my bugs</del> bugs I&#8217;ve discovered squashed anyway, all for pride in a codebase that should function right.</p>
<p>The short and long of it: warm and fuzzies all around.  Yay, Open Source.</p>
<pre class="brush: xml; title: ; notranslate" title="">
&#60;/gushing&#62;
</pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Complex Symbolization in GeoServer or Compass Rose Mania-- the GeoServer Version]]></title>
<link>http://smathermather.wordpress.com/2011/11/30/complex-symbolization-in-geoserver/</link>
<pubDate>Wed, 30 Nov 2011 06:04:13 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/11/30/complex-symbolization-in-geoserver/</guid>
<description><![CDATA[At my place of employment, we have a vegetation survey program with enough potential plots to serve]]></description>
<content:encoded><![CDATA[<p>At my place of employment, we have a vegetation survey program with enough potential plots to serve 50 years of data collection.  The points are laid out in a <a href="http://epa.gov/NHEERL/arm/documents/presents/grts_ss.pdf">Generalized Random Tessellation Stratified (GRTS)</a> to maximize the statistical power of the analyses we do with them.  Read more about GRTS.  I dare you.  Actually, it&#8217;s not so bad if you understand Quad-Trees and the like&#8211; it&#8217;s just a wicked clever way to ensure spatially-balanced random sampling in order to maximize power.</p>
<p>But GRTS is not the point.  The point is that we wanted to show in a map a 40 <del datetime="2011-12-01T03:31:17+00:00">ft</del> meter buffer, with some cues for the cardinal directions for our field staff.  We also wanted them to be able to make their own maps.  Enter some funky complex symbolization with a dashed line for the buffer, and dots for the cardinal directions, kind of like thousands of compass roses across the landscape:<br />
<div id="attachment_1114" class="wp-caption alignnone" style="width: 608px"><a href="http://smathermather.files.wordpress.com/2011/11/compass_rose_mania.png"><img src="http://smathermather.files.wordpress.com/2011/11/compass_rose_mania.png?w=598&#038;h=377" alt="" title="Compass Rose Mania-- the GeoServer Version" width="598" height="377" class="size-full wp-image-1114" /></a><p class="wp-caption-text">Compass Rose Mania-- the GeoServer Version</p></div>.</p>
<p>(BTW, find the flaw in this approach and you get my praise.  That and a dollar will buy you a cup of coffee&#8211; hint: we&#8217;re working in a State Plane that is Lambert Conformal Conic).</p>
<p>SLD below:</p>
<pre class="brush: xml; title: ; notranslate" title="">
&#60;?xml version=&#34;1.0&#34; encoding=&#34;ISO-8859-1&#34;?&#62;
&#60;StyledLayerDescriptor version=&#34;1.0.0&#34; xmlns=&#34;http://www.opengis.net/sld&#34; xmlns:ogc=&#34;http://www.opengis.net/ogc&#34;
  xmlns:xlink=&#34;http://www.w3.org/1999/xlink&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
  xsi:schemaLocation=&#34;http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd&#34;&#62;
  &#60;NamedLayer&#62;
    &#60;Name&#62;40 meter buffer&#60;/Name&#62;
    &#60;UserStyle&#62;
      &#60;Title&#62;40 meter buffer&#60;/Title&#62;
      &#60;Abstract&#62;&#60;/Abstract&#62;
      &#60;FeatureTypeStyle&#62;
        &#60;Rule&#62;
          &#60;Title&#62;40 meter buffer&#60;/Title&#62;
          &#60;Name&#62;40 meter buffer&#60;/Name&#62;
          &#60;MaxScaleDenominator&#62;100000&#60;/MaxScaleDenominator&#62;
          &#60;PolygonSymbolizer&#62;
            &#60;Geometry&#62;
              &#60;ogc:Function name=&#34;buffer&#34;&#62;
                &#60;ogc:PropertyName&#62;the_geom&#60;/ogc:PropertyName&#62;
                &#60;ogc:Literal&#62;131.2&#60;/ogc:Literal&#62;
              &#60;/ogc:Function&#62;
            &#60;/Geometry&#62;
            &#60;Stroke&#62;
              &#60;CssParameter name=&#34;stroke&#34;&#62;#d3d3d3&#60;/CssParameter&#62;
              &#60;CssParameter name=&#34;stroke-width&#34;&#62;2&#60;/CssParameter&#62;
            &#60;CssParameter name=&#34;stroke-dasharray&#34;&#62;2 2&#60;/CssParameter&#62;
            &#60;/Stroke&#62;
          &#60;/PolygonSymbolizer&#62;

          &#60;PointSymbolizer&#62;

            &#60;Geometry&#62;
               &#60;ogc:Function name=&#34;offset&#34;&#62;
                  &#60;ogc:PropertyName&#62;the_geom&#60;/ogc:PropertyName&#62;
                  &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                 &#60;ogc:Literal&#62;131.2&#60;/ogc:Literal&#62;
                 &#60;/ogc:Function&#62;
            &#60;/Geometry&#62;

            &#60;Graphic&#62;
              &#60;Mark&#62;
                &#60;WellKnownName&#62;circle&#60;/WellKnownName&#62;
                &#60;Fill&#62;
                  &#60;CssParameter name=&#34;fill&#34;&#62;#bebebe&#60;/CssParameter&#62;
                &#60;/Fill&#62;
              &#60;/Mark&#62;
              &#60;Size&#62;6&#60;/Size&#62;
            &#60;/Graphic&#62;
          &#60;/PointSymbolizer&#62;
       
          &#60;PointSymbolizer&#62;

            &#60;Geometry&#62;
               &#60;ogc:Function name=&#34;offset&#34;&#62;
                  &#60;ogc:PropertyName&#62;the_geom&#60;/ogc:PropertyName&#62;
                  &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                 &#60;ogc:Literal&#62;-131.2&#60;/ogc:Literal&#62;
                 &#60;/ogc:Function&#62;
            &#60;/Geometry&#62;

            &#60;Graphic&#62;
              &#60;Mark&#62;
                &#60;WellKnownName&#62;circle&#60;/WellKnownName&#62;
                &#60;Fill&#62;
                  &#60;CssParameter name=&#34;fill&#34;&#62;#bebebe&#60;/CssParameter&#62;
                &#60;/Fill&#62;
              &#60;/Mark&#62;
              &#60;Size&#62;6&#60;/Size&#62;
            &#60;/Graphic&#62;
          &#60;/PointSymbolizer&#62;
          
          &#60;PointSymbolizer&#62;

            &#60;Geometry&#62;
               &#60;ogc:Function name=&#34;offset&#34;&#62;
                  &#60;ogc:PropertyName&#62;the_geom&#60;/ogc:PropertyName&#62;
                  &#60;ogc:Literal&#62;131.2&#60;/ogc:Literal&#62;
                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                 &#60;/ogc:Function&#62;
            &#60;/Geometry&#62;

            &#60;Graphic&#62;
              &#60;Mark&#62;
                &#60;WellKnownName&#62;circle&#60;/WellKnownName&#62;
                &#60;Fill&#62;
                  &#60;CssParameter name=&#34;fill&#34;&#62;#bebebe&#60;/CssParameter&#62;
                &#60;/Fill&#62;
              &#60;/Mark&#62;
              &#60;Size&#62;6&#60;/Size&#62;
            &#60;/Graphic&#62;
          &#60;/PointSymbolizer&#62;
          
          &#60;PointSymbolizer&#62;

            &#60;Geometry&#62;
               &#60;ogc:Function name=&#34;offset&#34;&#62;
                  &#60;ogc:PropertyName&#62;the_geom&#60;/ogc:PropertyName&#62;
                  &#60;ogc:Literal&#62;-131.2&#60;/ogc:Literal&#62;
                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                 &#60;/ogc:Function&#62;
            &#60;/Geometry&#62;

            &#60;Graphic&#62;
              &#60;Mark&#62;
                &#60;WellKnownName&#62;circle&#60;/WellKnownName&#62;
                &#60;Fill&#62;
                  &#60;CssParameter name=&#34;fill&#34;&#62;#bebebe&#60;/CssParameter&#62;
                &#60;/Fill&#62;
              &#60;/Mark&#62;
              &#60;Size&#62;6&#60;/Size&#62;
            &#60;/Graphic&#62;
          &#60;/PointSymbolizer&#62;          
          
          
        &#60;/Rule&#62;

      &#60;/FeatureTypeStyle&#62;
    &#60;/UserStyle&#62;
  &#60;/NamedLayer&#62;
&#60;/StyledLayerDescriptor&#62;
&#60;/code&#62;&#60;/pre&#62;


</pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[What is the center line of a complex polygon? (cont. 3)]]></title>
<link>http://smathermather.wordpress.com/2011/10/18/what-is-the-center-line-of-a-complex-polygon-cont-3/</link>
<pubDate>Tue, 18 Oct 2011 11:56:04 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/10/18/what-is-the-center-line-of-a-complex-polygon-cont-3/</guid>
<description><![CDATA[Just a quick post on this one, this time. I haven&#8217;t implemented an approximation of Bálint Mik]]></description>
<content:encoded><![CDATA[<p>Just a quick post on this one, this time. I haven&#8217;t implemented an approximation of <a href="http://www.balintmiklos.com/">Bálint Miklós</a>&#8216; <a href="http://www.balintmiklos.com/scale-axis/scale_axis_transform_socg_2009.pdf">Scale Axis Transform</a> in PostGIS yet, and I don&#8217;t think I&#8217;ll dare try in GeoTools for GeoServer just yet, but I thought I&#8217;d give a preview of the sensitivity of the medial axis calculations in &#8220;bumpy&#8221; streams with the following image:</p>
<div id="attachment_1063" class="wp-caption alignnone" style="width: 875px"><a href="http://smathermather.files.wordpress.com/2011/10/stream_thiessen.png"><img class="size-full wp-image-1063" title="stream_thiessen" src="http://smathermather.files.wordpress.com/2011/10/stream_thiessen.png?w=865&#038;h=512" alt="" width="865" height="512" /></a><p class="wp-caption-text">Medial axis of</p></div>
<p>As you can see, the problem isn&#8217;t restricted to giraffes&#8230; <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[What is the center line of a complex polygon? (cont. 2)]]></title>
<link>http://smathermather.wordpress.com/2011/10/08/what-is-the-center-line-of-a-complex-polygon-cont-2/</link>
<pubDate>Sat, 08 Oct 2011 15:51:28 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/10/08/what-is-the-center-line-of-a-complex-polygon-cont-2/</guid>
<description><![CDATA[I glossed over the difficulties of finding the centerline of a complex polygon in the last couple of]]></description>
<content:encoded><![CDATA[<p>I glossed over the difficulties of finding the centerline of a complex polygon in the last couple of posts, and didn&#8217;t realize the disservice until we got to the nitty-gritty of finding the centerline of &#8220;bumpy&#8221; streams, for which our solution, which is arguably a discretized version of the traditional medial axis, is quite sensitive to noise and &#8220;bumpiness&#8221;.</p>
<p>With a little more googling, my collegue T. Kraft found <a href="http://www.balintmiklos.com/">Bálint Miklós</a> site describing <a href="http://www.balintmiklos.com/scale-axis/scale_axis_transform_socg_2009.pdf">The Scale Axis Transform</a>, an alternate technique that is not sensitive to noise, but looks at the importance factor of a feature to control whether we show an axis for it, e.g.:</p>
<p><img class="alignnone" src="http://www.balintmiklos.com/scale-axis/images/scale_axis_giraffe_4_small.png" /></p>
<p>&#160;<br />
Notice how many &#8220;extra&#8221; lines we have in the initial medial axis?  The scale axis transform really helps in trimming these out.  There are some really well done videos describing this process conceptually for both the 2D case and the 3D case.<br />
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='http://www.youtube.com/embed/-VsFTXfFXHQ?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span><br />
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='http://www.youtube.com/embed/hxe7TxSmrlM?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>We&#8217;ll see if we can implement an approximation of this technique in PostGIS.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[OGC Web Services and Security]]></title>
<link>http://smathermather.wordpress.com/2011/10/05/ogc-web-services-and-security/</link>
<pubDate>Thu, 06 Oct 2011 00:59:17 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/10/05/ogc-web-services-and-security/</guid>
<description><![CDATA[I&#8217;ve been starting to inform myself on authentication/authorization schemes for OGC Web Servic]]></description>
<content:encoded><![CDATA[<p>I&#8217;ve been starting to inform myself on authentication/authorization schemes for OGC Web Services (OWS). This is because, while I&#8217;m pretty pleased with most of the functionality basic mapping of our internal <a href="http://geoext.org/">GeoExt</a>/<a href="http://geoserver.org/">GeoServer</a>/<a href="http://postgis.refractions.net/">PostGIS</a> stack, user editing is the next natural step. As it is now, users can access a variety of really detailed useful layers, print to PDF, and for the most part the interface is simple and intuitive. The cartography is looking pretty good too. Some additional thought might be put into controlling which layers are available with other layers to ensure great cartographic output at all times, but baring some additional event handlers, and thus a much better JavaScript writer than I am, this won&#8217;t happen soon.</p>
<p>So, I turn my attention to markup and layer editing. Authentication and authorization must precede this. In my searches, I found this <a href="http://2010.foss4g.org/presentations/3235.pdf">summary document</a> from <a href="http://www.camptocamp.com/en">CamptoCamp</a> from FOSS4G <del datetime="2011-12-02T14:31:53+00:00">2011</del> 2010, with some great schema on the different options. The basic breakdown as I read it is this: there are two categories of protection: integrated authentication, such as the GeoServer Security Subsystem, and proxied authentication, such as <a href="http://52north.org/communities/security/wss/2.0/">52˚ North WSS</a>, <a href="https://github.com/camptocamp/secureOWS">SecureOWS</a>, or <a href="http://sites.google.com/site/geoshieldproject/">GeoShield</a>. The proxied systems can be further subdivided into systems which create an https tunnel with separate client and server software to provide a decoding localhost to prevent packet sniffing (i.e. SecureOWS), a web security service (WSS) service layer (i.e. 52˚ North WSS), and GeoShield&#8211; which can either act as a proxy or a (soon to be released) plugin for GeoServer&#8217;s existing subsystem (if I understand things correctly&#8211; which by things I mean <a href="https://docs.google.com/viewer?a=v&#38;pid=explorer&#38;chrome=true&#38;srcid=0B0m60Gnw8VKKNGYyZDU2MzQtYjJiMS00NTgwLWIxM2QtNGI2OTkyNzhiYjg3&#38;hl=it">this document</a> from FOSS4G 2011, as I missed the presentation itself).</p>
<p>The nice part for SecureOWS, as I see it, is that it creates a tunneled connection, so if you&#8217;re interested in preventing sniffing, man-in-the-middle attacks, etc., the extra complication of running a localhost decoder for SecureOWS might be worth it.  It&#8217;s a minor complication, but it is not as simple as HTTP BASIC authentication, which is what e.g. the GeoServer security sub-system does.  SecureOWS also should work with any client software that can access OWS services.  What I like about GeoShield is the ability to use Common Query Language (CQL) (and hopefully ECQL) to constrain almost every bit of behavior, from the extent returned, to the styles available, etc. etc., all that using a language construct common to GeoServer users, in addition to service level stuff like GetFeatureInfo, etc..  And finally, it seems that <code></code>52˚ North WSS (or WSS setups in general) are meant to handle end to end security, including encryption.  I don&#8217;t know if this level of complexity constrains potential client software, but it seems like it could.  This point might be moot, if the objective is to use a modern browser as the client, but could matter with legacy desktop applications (I&#8217;m now into the territory of suppositions and guesses, so please correct me if I&#8217;m wrong).  That said <code></code>52˚ North WSS also has fine control over geographic extent, service level, layers, etc., much as GeoShield.</p>
<p>What&#8217;s my conclusion?  I wish I knew.  I&#8217;m going to have to do some <a href="http://en.wiktionary.org/wiki/yak_shaving">yak shaving</a> tests.  GeoShield passed initial tests.  It seems, so far, to be easy to set up and maintain, and the Ext &#8220;Desktop&#8221; look and feel is downright cute.  GeoServer&#8217;s subsystem can authenticate against other services, such as LDAP, so I&#8217;ll be playing with that too.  We&#8217;ll see how far I get from there, and whether I test the encrypted options (SecureOWS and <cite><strong></strong></cite>52˚ North WSS) to ensure end-to-end security as well.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[What is the center line of a complex polygon? (cont.)]]></title>
<link>http://smathermather.wordpress.com/2011/09/26/what-is-the-center-line-of-a-complex-polygon-cont/</link>
<pubDate>Mon, 26 Sep 2011 16:34:04 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/09/26/what-is-the-center-line-of-a-complex-polygon-cont/</guid>
<description><![CDATA[If we try to extract the centerline of a polygon using Voronoi polygons, like in my previous post, i]]></description>
<content:encoded><![CDATA[<p>If we try to extract the centerline of a polygon using Voronoi polygons, like in my <a href="http://smathermather.wordpress.com/2011/09/16/what-is-the-center-line-of-a-polygon-or-how-to-change-labeling-in-geoserver/">previous post</a>, it works pretty well for hydrologic cases, like extracting a stream centerline from stream banks, e.g.:</p>
<div id="attachment_981" class="wp-caption alignnone" style="width: 370px"><a href="http://smathermather.files.wordpress.com/2011/09/stream_bank.png"><img class="size-full wp-image-981 " title="stream_bank" src="http://smathermather.files.wordpress.com/2011/09/stream_bank.png?w=360&#038;h=442" alt="" width="360" height="442" /></a><p class="wp-caption-text">Stream/River with digitized banks</p></div>
<div id="attachment_983" class="wp-caption alignnone" style="width: 370px"><a href="http://smathermather.files.wordpress.com/2011/09/stream_centerline1.png"><img class="size-full wp-image-983 " title="Stream Centerline" src="http://smathermather.files.wordpress.com/2011/09/stream_centerline1.png?w=360&#038;h=442" alt="" width="360" height="442" /></a><p class="wp-caption-text">Stream/River centerline extracted from stream banks</p></div>
<p>We&#8217;ll use this to extract flow lines, in order to build out a better hydrologic network, but also use it to update property boundaries based on deed descriptions which may alternately follow distances and bearings, or banks and centerlines of streams and rivers.</p>
<p>But, I was still curious to see how well it does on smaller polygons, e.g. does it help with labeling of parcel polygons:</p>
<p><a href="http://smathermather.files.wordpress.com/2011/09/25.jpg"><img class="alignnone size-full wp-image-986" title="25" src="http://smathermather.files.wordpress.com/2011/09/25.jpg?w=614&#038;h=386" alt="" width="614" height="386" /></a></p>
<p><a href="http://smathermather.files.wordpress.com/2011/09/26.jpg"><img class="alignnone size-full wp-image-987" title="26" src="http://smathermather.files.wordpress.com/2011/09/26.jpg?w=614&#038;h=386" alt="" width="614" height="386" /></a></p>
<p><a href="http://smathermather.files.wordpress.com/2011/09/27.jpg"><img class="alignnone size-full wp-image-988" title="27" src="http://smathermather.files.wordpress.com/2011/09/27.jpg?w=614&#038;h=386" alt="" width="614" height="386" /></a></p>
<p><a href="http://smathermather.files.wordpress.com/2011/09/29.jpg"><img class="alignnone size-full wp-image-989" title="29" src="http://smathermather.files.wordpress.com/2011/09/29.jpg?w=614&#038;h=386" alt="" width="614" height="386" /></a></p>
<p><a href="http://smathermather.files.wordpress.com/2011/09/30.jpg"><img class="alignnone size-full wp-image-990" title="30" src="http://smathermather.files.wordpress.com/2011/09/30.jpg?w=798&#038;h=502" alt="" width="798" height="502" /></a></p>
<p><a href="http://smathermather.files.wordpress.com/2011/09/31.jpg"><img class="alignnone size-full wp-image-991" title="31" src="http://smathermather.files.wordpress.com/2011/09/31.jpg?w=1024&#038;h=643" alt="" width="1024" height="643" /></a></p>
<p>Not perfect, but not bad.   Looks like developing a special case for equilateral triangle, circular, and square shaped polygons (etc) might be in order, as these are probably best labeled in a more simple fashion (see northeast corner of this map, parcel 48517140)&#8230; .</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PostgreSQL Views within GeoServer, GetFeatureInfo with Freemarker Templates, etc.]]></title>
<link>http://smathermather.wordpress.com/2011/08/20/postgresql-views-within-geoserver-getfeatureinfo-with-freemarker-templates-etc/</link>
<pubDate>Sat, 20 Aug 2011 23:40:42 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/08/20/postgresql-views-within-geoserver-getfeatureinfo-with-freemarker-templates-etc/</guid>
<description><![CDATA[GeoServer now has the ability to consume database views from PostGIS, not just raw tables. I say it]]></description>
<content:encoded><![CDATA[<p>GeoServer now has the ability to consume database views from PostGIS, not just raw tables. I say it &#8220;now&#8221; has that ability&#8211; I think that came online with GeoServer 2.x series, but I&#8217;m just &#8220;now&#8221; starting to take advantage of it. You can also create views on the fly within GeoServer, but I prefer to apply the logic at the database level, just in case I use something instead of or supplemental to GeoServer in the future, the application logic is built in at the PostGIS/PostgreSQL level.</p>
<p>To this end, we have an infrastructure database that is maintained in Access, the records of which I&#8217;d like a copy of in PostgreSQL. Long term, we will probably move the records over to PostgreSQL and link them, but for now we&#8217;ll retain two copies&#8211; a master copy in the Access database and a slave copy in PostgreSQL.</p>
<p>The tables in question were exported from Access initially (to get their schema just right) through an ODBC connection, and then re-added as linked tables through an ODBC connection. I decided that synchronization should happen only when I&#8217;m the user, so I don&#8217;t slow down other users&#8217; experiences, so the code for this is embedded in the main form and looks like this (just a little VBA):</p>
<pre><code> Private Sub Form_Close() 'Test for user If (Environ("username") = "smathermather") Then 'Disable user confirmation warnings DoCmd.SetWarnings False 'Remove all records in building tables DoCmd.RunSQL "DELETE FROM [public_Building Photos]" DoCmd.RunSQL "DELETE FROM [public_Building Statistics]" DoCmd.RunSQL "DELETE FROM [public_Building Utilities]" DoCmd.RunSQL "DELETE FROM [public_Master Building Inventory]" 'Reload all records in building tables DoCmd.RunSQL "INSERT INTO [public_Building Photos] SELECT [Building Photos].* FROM [Building Photos]" DoCmd.RunSQL "INSERT INTO [public_Building Statistics] SELECT [Building Statistics].* FROM [Building Statistics]" DoCmd.RunSQL "INSERT INTO [public_Building Utilities] SELECT [Building Utilities].* FROM [Building Utilities]" DoCmd.RunSQL "INSERT INTO [public_Master Building Inventory] SELECT [Master Building Inventory].* FROM [Master Building Inventory]" 'Reenable user confirmation warnings DoCmd.SetWarnings True End If End Sub </code></pre>
<p>Great, now the architecture database dumps into mine. It runs whenever I close the form, although this could be tied to a button or some other mechanism as well. Ideally, I suppose it would be simple enough to create a separate database with linked tables from each, have it run on start, and then schedule it to run periodically.</p>
<p>So, what to do next? Well this is a rich database with all sorts of information&#8211; we&#8217;ll need curate that information (is this an abuse of that word?). It has all sorts of building stats built in, a photo tied to the database etc.. This can all be curated with a database view.</p>
<pre><code> CREATE OR REPLACE VIEW public.cm_buildings AS SELECT build.name, build."Year Constructed", build."Square Footage", build."Construction Materials", build."Use Group", build."Architect", build."Structural Engineer", build."General Contractor", build."Site Location", build."Street Address", build."City", build."Phone", build."Capacity", build.link, build.the_geom, res."RES_LINK" AS vs_link FROM public."Building Reservable" res RIGHT JOIN ( SELECT photo."Building Name" AS name, stats."Year Constructed", stats."Square Footage", stats."Construction Materials", stats."Use Group", stats."Architect", stats."Structural Engineer", stats."General Contractor", master."Site Location", master."Street Address", master."City", master."Phone", master."Notations" AS "Capacity", regexp_replace(regexp_replace((string_to_array(photo."txtStockGraph", '\\'))[4], ' ', '_'), '.jpg', '') AS link, foot.the_geom FROM public."Master Building Inventory" master, public."Building Statistics" stats, public."Building Photos" photo, public.facilities_footprints_cm foot WHERE master."Building" = stats."Building" AND master."Building" = photo."Building Name" AND (master."Amenities" = 'BLD' OR master."Amenities" = 'CCF') AND master."Building Code" = foot."Building Code") build ON res.b_name_ar = build.name; ALTER TABLE public.cm_buildings OWNER TO postgres; GRANT ALL ON TABLE public.cm_buildings TO postgres; </code></pre>
<p>Now here&#8217;s the fun part. The paths to the images were several directories deep, etc., but I wanted to dump them all in a single directory. So the interesting part of the query is reformating the relative paths for the image locations and just grabbing the portion with the image name. In this case, they are all at the same depth in the directory structure, so I convert the string to an array using the backslash as my data separator, grab the 4th element, and then trim off the extension &#8220;.jpg&#8221; so I can manipulate the name further&#8211; like take advantage of some thumbnails I created with the same name but a &#8220;*.png&#8221; extension. That bit of (Postgres enhanced) SQL is as follows (it&#8217;s also in the above CREATE VIEW code, excerpted here for clarity):</p>
<pre><code> regexp_replace(regexp_replace((string_to_array(photo."txtStockGraph", '\\'))[4], ' ', '_'), '.jpg', '') AS link </code></pre>
<p>So, now we have a table with fields that can inform the user and serve as links to images available on the server. GeoServer allows for some really cool HTML templating with Freemarker Templates that we can take advantage of here. For a simple example, see <a title="Freemarker Templates in GeoServer" href="http://docs.geoserver.org/stable/en/user/tutorials/freemarker.html" target="_blank">the tutorial on GeoServer&#8217;s site.</a></p>
<p>For our example, we vamp a little (though not much):</p>
<pre class="brush: plain; title: ; notranslate" title="">

&#60;#--
Body section of the GetFeatureInfo template, it's provided with one feature collection, and
will be called multiple times if there are various feature collections
--&#62;
&#60;table&#62;
  &#60;tr&#62;
&#60;#list type.attributes as attribute&#62;
  &#60;#if !attribute.isGeometry&#62;
    &#60;#if attribute.name!=&#34;link&#34;&#62;
    &#60;#if attribute.name!=&#34;vs_link&#34;&#62;
      &#60;th&#62;${attribute.name}&#60;/th&#62;
   &#60;/#if&#62;
   &#60;/#if&#62;
  &#60;/#if&#62;
&#60;/#list&#62;
  &#60;/tr&#62;

&#60;#assign odd = false&#62;
&#60;#list features as feature&#62;
  &#60;#if odd&#62;
    &#60;tr&#62;
  &#60;#else&#62;
    &#60;tr&#62;
  &#60;/#if&#62;
  &#60;#assign odd = !odd&#62;
  &#60;#list feature.attributes as attribute&#62;
    &#60;#if !attribute.isGeometry&#62;
     &#60;#if attribute.name!=&#34;link&#34;&#62;
     &#60;#if attribute.name!=&#34;vs_link&#34;&#62;
       &#60;td&#62;${attribute.value}&#60;/td&#62;
     &#60;/#if&#62;
     &#60;/#if&#62;
    &#60;/#if&#62;
  &#60;/#list&#62;
  &#60;#if feature.link.value!=&#34;&#34;&#62;
      &#60;img src=&#34;arch/img/${feature.link.value}.png&#34;&#62;&#60;br&#62;&#60;br/&#62;
      &#60;a href=&#34;www/arch/img/${feature.link.value}.jpg&#34; target=&#34;_blank&#34;&#62;Full Size Image&#60;/a&#62; &#60;br&#62;&#60;br/&#62;
  &#60;/#if&#62;
  &#60;#if feature.vs_link.value!=&#34;&#34;&#62;
        &#60;a href=&#34;http://external_link.com/${feature.vs_link.value}&#34; target=&#34;_blank&#34;&#62;Reservable&#60;/a&#62; 
  &#60;/#if&#62;
  &#60;/tr&#62;
&#60;/#list&#62;
&#60;/table&#62;
&#60;br/&#62;

</pre>
<p>&#160;</p>
<p>&#160;</p>
<p>(Confession: I haven&#8217;t double checked my HTML yet to make sure that it&#8217;s perfect&#8230; ). Now we have to have a way for the user to get this info back with a GetFeatureInfo query, good old WMS standby (and essentially a subset of WFS features):</p>
<pre><code> var info = new OpenLayers.Control.WMSGetFeatureInfo({ drillDown: false, queryVisible: true, panMapIfOutOfView: false, url: GeoserverWMS, layerUrls: [GeowebcacheURL], eventListeners: { getfeatureinfo: function(event) { popup = new OpenLayers.Popup.FramedCloud( "popinfo", map.getLonLatFromPixel(event.xy), null, event.text, null, true ); map.addPopup(popup, true); } } }); map.addControl(info); info.activate(); </code></pre>
<p>And the results? Splendid:</p>
<div id="attachment_914" class="wp-caption alignnone" style="width: 1034px"><a href="http://smathermather.files.wordpress.com/2011/08/picnic_area_map.png"><img class="size-full wp-image-914" title="Map of Picnic Area" src="http://smathermather.files.wordpress.com/2011/08/picnic_area_map.png?w=1024&#038;h=646" alt="" width="1024" height="646" /></a><p class="wp-caption-text">Map of picnic area with GetFeatureInfo enabled on (brown) picnic structure.</p></div>
<div id="attachment_915" class="wp-caption alignnone" style="width: 1034px"><a href="http://smathermather.files.wordpress.com/2011/08/picnic_area_getfeatureinfo.png"><img class="size-full wp-image-915" title="Picnic area with GetFeatureInfo triggered" src="http://smathermather.files.wordpress.com/2011/08/picnic_area_getfeatureinfo.png?w=1024&#038;h=645" alt="" width="1024" height="645" /></a><p class="wp-caption-text">Picnic area with GetFeatureInfo triggered</p></div>
<p>Next trick will be to start building out tabbed interfaces inside the GetFeatureInfo bubble to consolidate and streamline the information as we add the available info.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Really loooong WMS requests]]></title>
<link>http://smathermather.wordpress.com/2011/08/03/really-loooong-wms-requests/</link>
<pubDate>Wed, 03 Aug 2011 11:29:34 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/08/03/really-loooong-wms-requests/</guid>
<description><![CDATA[We have a GeoExt/Mapfish/GeoServer/PostGIS stack in house that allows us to print nice maps through]]></description>
<content:encoded><![CDATA[<p>We have a GeoExt/Mapfish/GeoServer/PostGIS stack in house that allows us to print nice maps through a web interface.  There has been a ceiling, however, as far as size&#8211; 140dpi and 22&#215;34 has been the largest we&#8217;ve been able to render maps, and even then, sometimes the layers are too complicated.</p>
<p>For a long time I was under the naïve impression that it was a memory issue with JAITools.  The GeoServer users group set me straight on that&#8211; it was a timeout issue.  A couple more posts to GeoServer Users and Mapfish, and I really got set straight&#8211; in my case it was a client side timeout issue (I had already allowed for long WMS requests in GeoServer and in Mapfish&#8217;s config.yaml).  Since the stack includes GeoExt, and therefore leverages ExtJS, the solution is simple.  I now have the following line at the start of my javascript document:</p>
<p><code><br />
Ext.Ajax.timeout = 120000; //2 minutes<br />
</code></p>
<p>Now we can do 300dpi images/maps at 36 inches x 48 inches (about A0 for the folks on the International system).</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Contours-- Symbolized from a single table]]></title>
<link>http://smathermather.wordpress.com/2011/07/15/contours-symbolized-from-a-single-table/</link>
<pubDate>Fri, 15 Jul 2011 11:23:13 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/07/15/contours-symbolized-from-a-single-table/</guid>
<description><![CDATA[In a previous post, I restructured the contour data for display in GeoServer, e.g.: UPDATE base.cont]]></description>
<content:encoded><![CDATA[<p>In a <a href="https://smathermather.wordpress.com/2011/05/25/contours-structuring-postgis-data-for-viewing-with-geoserver-2/">previous post</a>, I restructured the contour data for display in GeoServer, e.g.:</p>
<pre><code>
UPDATE base.contours_2
	SET 	div_10 = CAST( contours_2.elevation % 10 AS BOOLEAN ),
		div_20 = CAST( contours_2.elevation % 20 AS BOOLEAN ),
		div_50 = CAST( contours_2.elevation % 50 AS BOOLEAN ),
		div_100 = CAST( contours_2.elevation % 100 AS BOOLEAN ),
		div_250 = CAST( contours_2.elevation % 250 AS BOOLEAN );
</code></pre>
<p>The SLD styling for the contours based on the new data structure will be forthcoming with my intern&#8217;s upcoming guest post, but in the meantime, I have a teaser of a map snapshot, served up through a GeoExt interface (note the correct contour intervals showing in the legend simply and elegantly because of the data structure and a single SLD):</p>
<div id="attachment_794" class="wp-caption alignnone" style="width: 310px"><a href="http://smathermather.files.wordpress.com/2011/07/screen-shot-2011-07-14-at-9-25-30-pm.png"><img class="size-medium wp-image-794 " title="Screen shot of Contours" src="http://smathermather.files.wordpress.com/2011/07/screen-shot-2011-07-14-at-9-25-30-pm.png?w=300&#038;h=148" alt="" width="300" height="148" /></a><p class="wp-caption-text">Contour Map, 10ft and 50ft contours</p></div>
<div id="attachment_795" class="wp-caption alignnone" style="width: 310px"><a href="http://smathermather.files.wordpress.com/2011/07/screen-shot-2011-07-14-at-9-36-08-pm.png"><img class="size-medium wp-image-795 " title="Over-zoom" src="http://smathermather.files.wordpress.com/2011/07/screen-shot-2011-07-14-at-9-36-08-pm.png?w=300&#038;h=149" alt="" width="300" height="149" /></a><p class="wp-caption-text">Over-zoom showing 2ft and 10ft Contours</p></div>
]]></content:encoded>
</item>
<item>
<title><![CDATA[WMS vs. WMTS and GetFeatureInfo Requests]]></title>
<link>http://smathermather.wordpress.com/2011/07/12/wms-vs-wmts-and-getfeatureinfo-requests/</link>
<pubDate>Tue, 12 Jul 2011 11:00:35 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/07/12/wms-vs-wmts-and-getfeatureinfo-requests/</guid>
<description><![CDATA[How to get GetFeatureInfo requests to perform against GeoWebCache?  Just don&#8217;t.  I&#8217;m unc]]></description>
<content:encoded><![CDATA[<p>How to get GetFeatureInfo requests to perform against GeoWebCache?  Just don&#8217;t.  I&#8217;m unclear as to whether it is problematic to do this because of a known bug or known implementation differences between the (unofficial) WMTS standard as implemented by OpenLayers and GeoServer, but in Googling for answers to how to perform a GetFeatureInfo request against GeoWebCache, I discovered a workaround (logged <a href="http://getsatisfaction.com/opengeo/topics/error_in_wmsgetfeatureinfo#reply_2612983">here</a> for example).  The trick is to specify the url for the WMSGetFeatureInfo request as your WMS service, and layersUrls as your GeoWebCache, if that&#8217;s what you&#8217;re using for all your layers, like in my case.</p>
<p>Here is a control all fleshed out (thanks to my intern John for writing/modifying all but two of these lines&#8230; ):</p>
<pre><code>
var info = new OpenLayers.Control.WMSGetFeatureInfo({
	drillDown: false,
	queryVisible: true,
	url: GeoserverWMS,
	layerUrls: [GeowebcacheURL],
	eventListeners: {
		getfeatureinfo: function(event) {
			popup = new OpenLayers.Popup.FramedCloud(
				"popinfo",
				map.getLonLatFromPixel(event.xy),
				null,
				event.text,
				null,
				true
			);

			map.addPopup(popup, true);
		}
	}
});

map.addControl(info);

info.activate();

</pre>
<p></code></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[GeoWebCache Configuration]]></title>
<link>http://smathermather.wordpress.com/2011/06/21/geowebcache-configuration/</link>
<pubDate>Tue, 21 Jun 2011 17:34:28 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/06/21/geowebcache-configuration/</guid>
<description><![CDATA[I&#8217;ve long delayed the configuration of GeoWebCache (GWC).  Automatic configuration within GeoS]]></description>
<content:encoded><![CDATA[<p>I&#8217;ve long delayed the configuration of GeoWebCache (GWC).  Automatic configuration within GeoServer&#8217;s deployment of it has been adequate until now.   Until now that I want to deploy tiles in something other than Google Mercator&#8230; .</p>
<p>I&#8217;ve developed a cache setup for Ohio State Plane North, Feet (epsg:3734).  At first it was a going to be a cache just for our service area, then I thought I&#8217;d include surrounding counties, and by the time I was done, I just decided that having a cache definition for the entire state plane ohio north coverage area made as much sense as anything else&#8211; it could make things easier to share and integrate as part of a regional standard for <a href="http://wiki.osgeo.org/wiki/WMS_Tiling_Client_Recommendation">WMS-C</a>, assuming I get buy-in from others&#8230; .  It could also be easily adapted for State Plane South.</p>
<p>The definition for a cache requires three things:  coordinate extent, resolutions (or equivalent), and tilesize (height and width).  For coordinate extent, I chose the extents of epsg:3734 as defined by <a href="http://www.spatialreference.org/ref/epsg/3734/">spatialreference.or</a>g, and snapped them to the nearest 5000 foot interval:</p>
<p><code></p>
<p>1320000</p>
<p>160000</p>
<p>2525000</p>
<p>976000</p>
<p></code></p>
<p>Then, choosing resolution based on a series of measurable scales (1:600 or 1&#8243;=50&#8242;, 1:1200 or 1&#8243;=100&#8242;, etc) we get the resolutions:</p>
<p><code></p>
<p>918.6351706036746</p>
<p>229.65879265091866</p>
<p>58.20472440944883</p>
<p>45.931758530183735</p>
<p>29.102362204724415</p>
<p>22.047244094488192</p>
<p>14.220472440944883</p>
<p>11.023622047244096</p>
<p>8.818897637795276</p>
<p>8.267716535433072</p>
<p>5.511811023622048</p>
<p>4.409448818897638</p>
<p>2.204724409448819</p>
<p>1.1023622047244095</p>
<p>0.5511811023622047*</code></p>
<p>Finally, we&#8217;ll use a predictable tilesize:</p>
<p><code>&#60;tileHeight&#62;256&#60;/tileHeight&#62;</p>
<p>&#60;tileWidth&#62;256&#60;/tileWidth&#62;</code></p>
<p>Now we have a portable tilecache recommendation that should work for all of Northern Ohio:<br />
<a href="http://smathermather.wordpress.com/gwc-example/">GWC Example</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Contours-- Structuring PostGIS data for viewing with GeoServer]]></title>
<link>http://smathermather.wordpress.com/2011/05/25/contours-structuring-postgis-data-for-viewing-with-geoserver-2/</link>
<pubDate>Thu, 26 May 2011 00:57:27 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/05/25/contours-structuring-postgis-data-for-viewing-with-geoserver-2/</guid>
<description><![CDATA[Naively structured data is my bane&#8211; the desire (and need) to get stuff done so often overtakes]]></description>
<content:encoded><![CDATA[<p>Naively structured data is my bane&#8211; the desire (and need) to get stuff done so often overtakes the time needed to do things the better way.  So, we bootstrap.</p>
<p>A long time ago, we managed to load in a few tens of gigs of <a href="http://smathermather.wordpress.com/tag/contours/">contour data</a> into PostGIS, partitioned it into 2ft, 10ft, 20ft, 50ft, 100ft and 250ft tables using <a href="http://smathermather.wordpress.com/2010/02/23/contour-data-and-table-management-in-postgis/">select queries</a> with a modulus operator, e.g.</p>
<pre><code>
CREATE TABLE base.cuy_contours_10
	AS
	SELECT elevation, the_geom
		FROM base.cuy_contours_2
		WHERE base.cuy_contours_2.elevation % 10 = 0;
</code></pre>
<p>And then we built <a href="http://en.wikipedia.org/wiki/Styled_Layer_Descriptor">SLD</a>&#8216;s to display the data in <a href="http://geoserver.org">GeoServer</a> and formed the data into <a href="http://workshops.opengeo.org/geoserver-intro/data/layergroups.html">layer groups</a>, and away we went&#8230; .</p>
<p>However, layer groups can often be replaced by properly structured PostGIS tables.  For large (and homogenous) datasets like this, it&#8217;s the only way to go.  In addition, properly structuring this allows us to take advantage of GeoServer&#8217;s ability to modify the legend based on zoom extent, which for representing contours at a range of scales is an almost &#8220;must have&#8221;.</p>
<p>To structure the table, we could be disciplined and build this out as a proper <a href="http://en.wikipedia.org/wiki/Database_normalization">normalized relational dataset</a> where our gid is used to determine if a contour is divisible by 10, 20, 50 etc., and while &#8220;I don&#8217;t wanna&#8221; isn&#8217;t a good enough reason not to do this, I think the computational overhead of a database view piecing these data back into a single table each time we need to access this would not be justified in the light of the static nature of the table.  So database normalization be darned, disk space is cheap, full speed ahead.  Let&#8217;s add some boolean fields for flagging whether a contour is divisible by our numbers and calculate that out:</p>
<pre><code>
UPDATE base.contours_2
	SET div_10 = CAST( contours_2.elevation % 10 AS BOOLEAN );
</code></pre>
<p>&#8230;</p>
<pre><code>
UPDATE base.contours_2
	SET div_250 = CAST( contours_2.elevation % 250 AS BOOLEAN );
</code></pre>
<p>yields the following (with highlights added):</p>
<p><a href="http://smathermather.files.wordpress.com/2011/05/table1.png"><img class="alignnone size-full wp-image-621" title="Contours Table" src="http://smathermather.files.wordpress.com/2011/05/table1.png?w=686&#038;h=515" alt="" width="686" height="515" /></a></p>
<p>Sort of the opposite of what I intended, the &#8220;falses&#8221; maybe should be &#8220;trues&#8221; and vice versa, but hey, it&#8217;ll work anyway.  BTW, we did test doing this calculation a few different ways, and while I can&#8217;t remember all the details, doing this as a calculation instead of doing an update query with a while statement testing the modulus was much faster (3x faster).</p>
<p>Ok, so now we <a href="http://smathermather.wordpress.com/2011/05/25/sld-for-contour-data/">style an sld</a> for it, and sit back and enjoy (pics later&#8230;).</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[GeoServer and efficient delivery of raster data (image pyramid layer)]]></title>
<link>http://smathermather.wordpress.com/2011/05/12/geoserver-and-efficient-delivery-of-raster-data-image-pyramid-layer/</link>
<pubDate>Thu, 12 May 2011 13:38:25 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/05/12/geoserver-and-efficient-delivery-of-raster-data-image-pyramid-layer/</guid>
<description><![CDATA[One thing I&#8217;ve learned in the last few years is that there is no theoretical reason why (prope]]></description>
<content:encoded><![CDATA[<p>One thing I&#8217;ve learned in the last few years is that there is no theoretical reason why (properly indexed and summarized) data cannot be displayed at all scales as quickly as at any scale.  This is the principle at work behind the extraordinary efficiencies of delivering data and imagery through a slippy map interface like Google, Bing, and OpenLayers as well as efficient thick client interfaces like Google Earth.  So, in principle, and largely in practice, serving spatial data for a whole county or the whole world shouldn&#8217;t be any more onerous than serving data for a particular site, so long as you have adequate storage for the pre-rendered and summarized data, and time to pre-render the data.  As storage tends to be cheaper than processing and network speed, this is a no-brainer.</p>
<p>A number of great Open Source tools exist to help with serving large amounts of data efficiently, not the least of which is my favorite, <a href="http://geoserver.org/" title="GeoServer" target="_blank">GeoServer</a> (paired with <a href="http://geowebcache.org/" title="GeoWebCache" target="_blank">GeoWebCache</a>).  For serving imagery, in our case orthorectified 0.6-inch (0.1524 meter) aerial imagery, we have a few options.  GeoServer does natively support GeoTiff, but for this large an area at this level of detail, we&#8217;d have to wade into the realm of BigTiff support through the GDAL extension, because we have 160GB imagery to serve.  We could use wavelet compressed imagery, e.g. MrSid or ECW or Jpeg2000, but I don&#8217;t have a license to create a lossless version of these, and besides, storage is cheaper than processors&#8211; wavelet compressed imagery may be a good field solution, but for server side work, it doesn&#8217;t make a lot of sense unless it&#8217;s all you have available.  Finally, there are two data source extensions to GeoServer meant for large imagery, the <a href="http://docs.geoserver.org/latest/en/user/data/imagemosaic.html" title="ImageMosaic Plugin, Geoserver" target="_blank">ImageMosaic Plugin</a>, and the <a href="http://docs.geoserver.org/latest/en/user/data/imagepyramid.html" title="ImagePyramid Plugin, Geoserver" target="_blank">ImagePyramid Plugin</a>.  The ImageMosaic Plugin works well for serving large amounts of images, and has some great flexibility with respect to handling transparency and image overlap.  The ImagePyramid extension is tuned for serving imagery at many scales.  The latter is what we chose to deploy.</p>
<p>The ImagePyramid extension takes advantage of <a href="http://www.gdal.org/gdal_retile.html" title="GDAL Retile Utility" target="_blank">gdal_retile.py</a>, a utility built as part of <a href="http://www.gdal.org/" title="GDAL-- Geospatial Data Abstraction Library" target="_blank">GDAL</a> that takes an image or set of images and re-tiles them to a standardized size (e.g. 2048&#215;2048) and creates overviews as separate images in a hierachy (here shown as outlines of the images):<a href="http://smathermather.files.wordpress.com/2011/05/clipboard011.png"><img src="http://smathermather.files.wordpress.com/2011/05/clipboard011.png?w=410&#038;h=410" alt="" title="Clipboard01" width="410" height="410" class="alignnone size-full wp-image-552" /></a><a href="http://smathermather.files.wordpress.com/2011/05/clipboard021.png"><img src="http://smathermather.files.wordpress.com/2011/05/clipboard021.png?w=410&#038;h=410" alt="" title="Clipboard02" width="410" height="410" class="alignnone size-full wp-image-553" /></a><a href="http://smathermather.files.wordpress.com/2011/05/clipboard031.png"><img src="http://smathermather.files.wordpress.com/2011/05/clipboard031.png?w=410&#038;h=410" alt="" title="Clipboard03" width="410" height="410" class="alignnone size-full wp-image-554" /></a><a href="http://smathermather.files.wordpress.com/2011/05/clipboard04.png"><img src="http://smathermather.files.wordpress.com/2011/05/clipboard04.png?w=410&#038;h=410" alt="" title="Clipboard04" width="410" height="410" class="alignnone size-full wp-image-555" /></a></p>
<p>But here&#8217;s the problem&#8211; for some reason, I can&#8217;t load all the images at once.  <a href="http://smathermather.files.wordpress.com/2011/05/pyramids.png"><img src="http://smathermather.files.wordpress.com/2011/05/pyramids.png?w=1024&#038;h=745" alt="" title="pyramids" width="1024" height="745" class="alignnone size-large wp-image-558" /></a>If I do, only the low resolution pyramids (8-foot pixels and larger) load.  If I break the area into smaller chunks, most of them fewer than 2000 images, they load fine.<div id="attachment_564" class="wp-caption alignnone" style="width: 853px"><a href="http://smathermather.files.wordpress.com/2011/05/zoom_in.png"><img src="http://smathermather.files.wordpress.com/2011/05/zoom_in.png?w=843&#038;h=796" alt="" title="zoom_in" width="843" height="796" class="size-full wp-image-564" /></a><p class="wp-caption-text">1&#34; = 50&#039; scale snapshot</p></div><br />
<div id="attachment_565" class="wp-caption alignnone" style="width: 852px"><a href="http://smathermather.files.wordpress.com/2011/05/zoom_out.png"><img src="http://smathermather.files.wordpress.com/2011/05/zoom_out.png?w=842&#038;h=798" alt="" title="zoom_out" width="842" height="798" class="size-full wp-image-565" /></a><p class="wp-caption-text">1:32,000 scale snapshot</p></div></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Geometry Collections and Small Headaches (pics)]]></title>
<link>http://smathermather.wordpress.com/2011/02/10/geometry-collections-and-small-headaches-pics/</link>
<pubDate>Thu, 10 Feb 2011 15:47:49 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/02/10/geometry-collections-and-small-headaches-pics/</guid>
<description><![CDATA[]]></description>
<content:encoded><![CDATA[
		<style type='text/css'>
			#gallery-533-2 {
				margin: auto;
			}
			#gallery-533-2 .gallery-item {
				float: left;
				margin-top: 10px;
				text-align: center;
				width: 33%;
			}
			#gallery-533-2 img {
				border: 2px solid #cfcfcf;
			}
			#gallery-533-2 .gallery-caption {
				margin-left: 0;
			}
		</style>
		<!-- see gallery_shortcode() in wp-includes/media.php -->
		<div data-carousel-extra='{"blog_id":4275586,"permalink":"http:\/\/smathermather.wordpress.com\/2011\/02\/10\/geometry-collections-and-small-headaches-pics\/","likes_blog_id":4275586}' id='gallery-533-2' class='gallery galleryid-533 gallery-columns-3 gallery-size-thumbnail'><dl class='gallery-item'>
			<dt class='gallery-icon portrait'>
				<a href='http://smathermather.wordpress.com/2011/02/10/geometry-collections-and-small-headaches-pics/contours1/' title='contours1'><img data-liked='0' data-reblogged='0' data-attachment-id="534" data-orig-file="http://smathermather.files.wordpress.com/2011/02/contours1.png" data-orig-size="128,639" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="contours1" data-image-description="" data-medium-file="http://smathermather.files.wordpress.com/2011/02/contours1.png?w=60" data-large-file="http://smathermather.files.wordpress.com/2011/02/contours1.png?w=128" width="30" height="150" src="http://smathermather.files.wordpress.com/2011/02/contours1.png?w=30&#038;h=150" class="attachment-thumbnail" alt="contours1" /></a>
			</dt></dl><dl class='gallery-item'>
			<dt class='gallery-icon landscape'>
				<a href='http://smathermather.wordpress.com/2011/02/10/geometry-collections-and-small-headaches-pics/contours2/' title='contours2'><img data-liked='0' data-reblogged='0' data-attachment-id="535" data-orig-file="http://smathermather.files.wordpress.com/2011/02/contours2.png" data-orig-size="1013,748" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="contours2" data-image-description="" data-medium-file="http://smathermather.files.wordpress.com/2011/02/contours2.png?w=300" data-large-file="http://smathermather.files.wordpress.com/2011/02/contours2.png?w=1013" width="150" height="110" src="http://smathermather.files.wordpress.com/2011/02/contours2.png?w=150&#038;h=110" class="attachment-thumbnail" alt="contours2" /></a>
			</dt></dl>
			<br style='clear: both;' />
		</div>

]]></content:encoded>
</item>
<item>
<title><![CDATA[GeoServer Optimization]]></title>
<link>http://smathermather.wordpress.com/2011/02/05/geoserver-optimization/</link>
<pubDate>Sat, 05 Feb 2011 20:37:08 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/02/05/geoserver-optimization/</guid>
<description><![CDATA[As we move away from a simple stack of PostGIS/GeoServer/GeoWebCache/Openlayers to wrapping a MapFis]]></description>
<content:encoded><![CDATA[<p>As we move away from a simple stack of PostGIS/GeoServer/GeoWebCache/Openlayers to wrapping a MapFish print service into the stack, it&#8217;s time to think more seriously about optimizing and stabilizing GeoServer.</p>
<p>In preparation for this step, I&#8217;ve been setting up a series of VMWare ESX-hosted Debian Linux VMs to function as the cluster of geospatial services.</p>
<p>Fortunately for me, there&#8217;s plenty of great advice in Andre Aime&#8217;s 2009 Foss4G presentation <a href="http://blip.tv/file/2796322/"><em>GeoServer in Production</em></a>.  Here&#8217;s what I gleaned from the presentation (any mistakes are undoubtedly mine and not Aime&#8217;s), plus a little bit of expansion from me:</p>
<p>1)  Control the requests coming into the system.  In this case, Andre talks about application container requests, limiting, e.g. Tomcat concurrent requests to 20 instead of the default 200:</p>
<p><code> maxThreads="20" minSpareThreads="20" </code></p>
<p>2)  Set up a high availability (HA) cluster.  There are lots of ways to skin this beast, but a cheap and easy way is via the <a href="http://siag.nu/pen/vrrpd-linux2.shtml">Ultimate Cheapskate Cluster</a>.  In Aime&#8217;s presentation, this is using vrrpd + balance, but with the current option of using &#8220;<a href="http://siag.nu/pen/">Pen</a>&#8220;, stateful protocols like WFS-Transactional should be supported in addition to WMS.</p>
<p>3) Set up your java virtual machines intelligently.  Most of this information get&#8217;s covered in GeoServer&#8217;s documentation page <a href="http://docs.geoserver.org/stable/en/user/production/index.html"><em>Running in a Production Environment</em></a>.   Additions from Andre&#8217;s presentation which might still be relevant are the following JVM flags:<br />
<code><br />
-XX:NewRatio=2<br />
-XX:+AggressiveOpt</code></p>
<p>If you use the second one, the JVM will use experimental optimizations, so test for stability before using this in a production environment.  The first one notifies the virtual machine that there will be many temporary objects.</p>
<p>(FYI, for the nubes like me out there&#8211; JVM flags for Tomcat are set in the Catalina.sh startup script.)</p>
<p>3a) This get&#8217;s a special subheading, &#8217;cause I couldn&#8217;t figure out why my WMS rendering was slow and unstable when I switched from Windows to Linux: <em><a href="http://docs.geoserver.org/stable/en/user/production/java.html">Install and Use JAI &#38; JAI Image I/O</a>.</em></p>
<p>4) Finally, make sure your data are structured properly.  If it&#8217;s really big imagery (&#62;2GB), use an <a href="http://docs.geoserver.org/stable/en/user/tutorials/imagepyramid/imagepyramid.html">Image Pyramid</a>, but otherwise, take advantage of internal tiling and overviews.  Examples from <a href="http://www.gdal.org/gdal_utilities.html">gdal&#8217;s utilities</a> include<br />
<code>gdal_translate -of GTiff -co "TILED=YES" utm.tif utm_tiled.tif</code><br />
which creates internal tiling, and</p>
<p><code>gdaladdo -r average utm_tiled.tif 2 4 8 16 32 64 128 256</code></p>
<p>which adds overviews.  You might also look to optimize the size of internal tiling.</p>
<p>For vector data, use PostGIS (not shapefiles), and index on your geometry and any attributes that are used in your SLD as filters.  Also, show simple symbology when &#8220;zoomed out&#8221;, and reserve the complex rules for closer zoom levels.</p>
<p>An alternative that Aime doesn&#8217;t mention is that for really complicated data, you can do additional optimization. You can create generalized geometry columns as alternate columns.  This is the vector equivalent of overviews.  The SLD can then be coded to use the alternate simplified geometry at coarser scales (see e.g. <a href="http://docs.geoserver.org/stable/en/user/styling/sld-tipstricks/mixed-geometries.html?highlight=generalize">this post</a> for info on how to specify the geometry column in an SLD).  I wish I could find the GeoServer post that originally advocated this technique&#8230; .</p>
<p>Hopefully this helps stabilize, optimize, and increase the availability of your GeoServer instance.  Hopefully it does so for mine as well&#8230; .</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Parcel Annotations in GeoServer (with some Maplex help) (cont. 2)]]></title>
<link>http://smathermather.wordpress.com/2011/02/04/parcel-annotations-in-geoserver-with-some-maplex-help-cont-2/</link>
<pubDate>Fri, 04 Feb 2011 14:05:51 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/02/04/parcel-annotations-in-geoserver-with-some-maplex-help-cont-2/</guid>
<description><![CDATA[I promised pics from our labeled parcels: &nbsp; http://smathermather.wordpress.com/2011/02/01/parce]]></description>
<content:encoded><![CDATA[<p>I promised pics from our labeled parcels:</p>

		<style type='text/css'>
			#gallery-514-4 {
				margin: auto;
			}
			#gallery-514-4 .gallery-item {
				float: left;
				margin-top: 10px;
				text-align: center;
				width: 33%;
			}
			#gallery-514-4 img {
				border: 2px solid #cfcfcf;
			}
			#gallery-514-4 .gallery-caption {
				margin-left: 0;
			}
		</style>
		<!-- see gallery_shortcode() in wp-includes/media.php -->
		<div data-carousel-extra='{"blog_id":4275586,"permalink":"http:\/\/smathermather.wordpress.com\/2011\/02\/04\/parcel-annotations-in-geoserver-with-some-maplex-help-cont-2\/","likes_blog_id":4275586}' id='gallery-514-4' class='gallery galleryid-514 gallery-columns-3 gallery-size-thumbnail'><dl class='gallery-item'>
			<dt class='gallery-icon portrait'>
				<a href='http://smathermather.wordpress.com/2011/02/04/parcel-annotations-in-geoserver-with-some-maplex-help-cont-2/parcel1/' title='parcel1'><img data-liked='0' data-reblogged='0' data-attachment-id="517" data-orig-file="http://smathermather.files.wordpress.com/2011/02/parcel1.png" data-orig-size="779,835" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="parcel1" data-image-description="" data-medium-file="http://smathermather.files.wordpress.com/2011/02/parcel1.png?w=279" data-large-file="http://smathermather.files.wordpress.com/2011/02/parcel1.png?w=779" width="139" height="150" src="http://smathermather.files.wordpress.com/2011/02/parcel1.png?w=139&#038;h=150" class="attachment-thumbnail" alt="parcel1" /></a>
			</dt></dl><dl class='gallery-item'>
			<dt class='gallery-icon portrait'>
				<a href='http://smathermather.wordpress.com/2011/02/04/parcel-annotations-in-geoserver-with-some-maplex-help-cont-2/parcel2/' title='parcel2'><img data-liked='0' data-reblogged='0' data-attachment-id="518" data-orig-file="http://smathermather.files.wordpress.com/2011/02/parcel2.png" data-orig-size="741,790" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="parcel2" data-image-description="" data-medium-file="http://smathermather.files.wordpress.com/2011/02/parcel2.png?w=281" data-large-file="http://smathermather.files.wordpress.com/2011/02/parcel2.png?w=741" width="140" height="150" src="http://smathermather.files.wordpress.com/2011/02/parcel2.png?w=140&#038;h=150" class="attachment-thumbnail" alt="parcel2" /></a>
			</dt></dl><dl class='gallery-item'>
			<dt class='gallery-icon portrait'>
				<a href='http://smathermather.wordpress.com/2011/02/04/parcel-annotations-in-geoserver-with-some-maplex-help-cont-2/parcel3/' title='parcel3'><img data-liked='0' data-reblogged='0' data-attachment-id="519" data-orig-file="http://smathermather.files.wordpress.com/2011/02/parcel3.png" data-orig-size="735,802" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="parcel3" data-image-description="" data-medium-file="http://smathermather.files.wordpress.com/2011/02/parcel3.png?w=274" data-large-file="http://smathermather.files.wordpress.com/2011/02/parcel3.png?w=735" width="137" height="150" src="http://smathermather.files.wordpress.com/2011/02/parcel3.png?w=137&#038;h=150" class="attachment-thumbnail" alt="parcel3" /></a>
			</dt></dl><br style="clear: both" />
			<br style='clear: both;' />
		</div>

<p>&#160;</p>
<p><a href="http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help/">http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help/</a></p>
<p><a href="http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help-cont-1/">http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help-cont-1/</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Parcel Annotations in GeoServer (with some Maplex help) (cont. 1)]]></title>
<link>http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help-cont-1/</link>
<pubDate>Wed, 02 Feb 2011 04:37:30 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help-cont-1/</guid>
<description><![CDATA[See the previous post for an explanation, but here's the SLD we used for parcel labeling. Now rememb]]></description>
<content:encoded><![CDATA[<pre>See the <a href="http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help/">previous post</a> for an explanation, but here's the SLD we used for parcel labeling.  Now remember-- we got
those rotation values from Maplex, so this isn't a pure use of SLDs, but boy is it a long one anyway:

&#60;?xml version="1.0" encoding="ISO-8859-1"?&#62;
&#60;StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"&#62;
  &#60;NamedLayer&#62;
    &#60;Name&#62;Parcels Annotation&#60;/Name&#62;
    &#60;UserStyle&#62;
    &#60;Title&#62;Parcels Annotation&#60;/Title&#62;
    &#60;Abstract&#62;Symbolization for labelling of parcels&#60;/Abstract&#62;
      &#60;FeatureTypeStyle&#62;

                   &#60;Rule&#62;
        &#60;Name&#62;rule1&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsEqualTo&#62;
                                &#60;ogc:PropertyName&#62;res_prop&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;Y&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsEqualTo&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;20&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;32001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;64000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                           &#60;Rule&#62;
        &#60;Name&#62;rule2&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsEqualTo&#62;
                                &#60;ogc:PropertyName&#62;res_prop&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;N&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsEqualTo&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;20&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;18001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;64000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                           &#60;Rule&#62;
        &#60;Name&#62;rule3&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsEqualTo&#62;
                                &#60;ogc:PropertyName&#62;res_prop&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;Y&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsEqualTo&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;20.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;18001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;64000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;8.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                          &#60;Rule&#62;
        &#60;Name&#62;rule4&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsEqualTo&#62;
                                &#60;ogc:PropertyName&#62;res_prop&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;Y&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsEqualTo&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;50.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;18001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;64000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;6.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                   &#60;Rule&#62;
        &#60;Name&#62;rule5&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                          &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;20&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;12001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;18000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;12.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                   &#60;Rule&#62;
        &#60;Name&#62;rule6&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;20.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;12001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;18000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                           &#60;Rule&#62;
        &#60;Name&#62;rule7&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;3&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;10&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;12001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;18000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;8.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;
        &#60;Rule&#62;
                &#60;Name&#62;rule8&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;1&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;3&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;12001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;18000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;6.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                &#60;Rule&#62;
                &#60;Name&#62;rule9&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;1&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;12001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;18000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;4.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                          &#60;Rule&#62;
        &#60;Name&#62;rule10&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                          &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;5&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;9001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;12000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;12.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                        &#60;Rule&#62;
                &#60;Name&#62;rule11&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;5.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;10&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;9001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;12000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                                &#60;Rule&#62;
                &#60;Name&#62;rule12&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;2.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;5&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;9001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;12000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;8.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                                        &#60;Rule&#62;
                &#60;Name&#62;rule13&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;2&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;9001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;12000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;6.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

        &#60;Rule&#62;
                        &#60;Name&#62;rule15&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;9001&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;12000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;4.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                   &#60;Rule&#62;
        &#60;Name&#62;rule16&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                   &#60;ogc:Filter&#62;
                          &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;2&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;4201&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;9000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;16.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                   &#60;Rule&#62;
        &#60;Name&#62;rule17&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;2.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;4201&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;9000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;10.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                           &#60;Rule&#62;
        &#60;Name&#62;rule18&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;4201&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;9000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;8.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;
        &#60;Rule&#62;
                &#60;Name&#62;rule19&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

                    &#60;ogc:Filter&#62;
                        &#60;ogc:And&#62;
                            &#60;ogc:PropertyIsGreaterThanOrEqualTo&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;0.3&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsGreaterThanOrEqualTo&#62;
                            &#60;ogc:PropertyIsLessThan&#62;
                                &#60;ogc:PropertyName&#62;acreage&#60;/ogc:PropertyName&#62;
                                &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                            &#60;/ogc:PropertyIsLessThan&#62;
                        &#60;/ogc:And&#62;
                    &#60;/ogc:Filter&#62;

          &#60;MinScaleDenominator&#62;4201&#60;/MinScaleDenominator&#62;
          &#60;MaxScaleDenominator&#62;9000&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;6.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

                &#60;Rule&#62;
                &#60;Name&#62;rule20&#60;/Name&#62;
      	&#60;Title&#62;Parcels&#60;/Title&#62;
      	&#60;Abstract&#62;Symbolization: Parcels zoomed-out&#60;/Abstract&#62;

          &#60;MaxScaleDenominator&#62;4200&#60;/MaxScaleDenominator&#62;

                                        &#60;TextSymbolizer&#62;
                        &#60;Label&#62;
                            &#60;ogc:PropertyName&#62;textstring&#60;/ogc:PropertyName&#62;
                        &#60;/Label&#62;
                        &#60;Font&#62;
                            &#60;CssParameter name="font-family"&#62;
                                &#60;ogc:Literal&#62;Calibri&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-size"&#62;
                                 &#60;ogc:Literal&#62;14.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-style"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="font-weight"&#62;
                                &#60;ogc:Literal&#62;normal&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Font&#62;
                        &#60;LabelPlacement&#62;
                            &#60;PointPlacement&#62;
                                &#60;AnchorPoint&#62;
                                    &#60;AnchorPointX&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointX&#62;
                                    &#60;AnchorPointY&#62;
                                        &#60;ogc:Literal&#62;0.5&#60;/ogc:Literal&#62;
                                    &#60;/AnchorPointY&#62;
                                &#60;/AnchorPoint&#62;
                                &#60;Displacement&#62;
                                    &#60;DisplacementX&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementX&#62;
                                    &#60;DisplacementY&#62;
                                        &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
                                    &#60;/DisplacementY&#62;
                                &#60;/Displacement&#62;
                               &#60;Rotation&#62;
                                      &#60;ogc:PropertyName&#62;rot_ang&#60;/ogc:PropertyName&#62;
                                &#60;/Rotation&#62;
                            &#60;/PointPlacement&#62;
                        &#60;/LabelPlacement&#62;

            		&#60;Halo&#62;
                		&#60;Radius&#62;
			                 &#60;ogc:Literal&#62;0&#60;/ogc:Literal&#62;
	        	        &#60;/Radius&#62;
        	        	&#60;Fill&#62;
			                &#60;CssParameter name="fill"&#62;#000000&#60;/CssParameter&#62;
			                &#60;CssParameter name="fill-opacity"&#62;0.0&#60;/CssParameter&#62;
		                &#60;/Fill&#62;
		        &#60;/Halo&#62;

                        &#60;Fill&#62;
                            &#60;CssParameter name="fill"&#62;
                                &#60;ogc:Literal&#62;#000000&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                            &#60;CssParameter name="fill-opacity"&#62;
                                &#60;ogc:Literal&#62;1.0&#60;/ogc:Literal&#62;
                            &#60;/CssParameter&#62;
                        &#60;/Fill&#62;
                        &#60;VendorOption name="repeat"&#62;1000&#60;/VendorOption&#62;
                        &#60;VendorOption name="goodnessOfFit"&#62;0.95&#60;/VendorOption&#62;

                    &#60;/TextSymbolizer&#62;
        &#60;/Rule&#62;

      &#60;/FeatureTypeStyle&#62;
    &#60;/UserStyle&#62;
  &#60;/NamedLayer&#62;
&#60;/StyledLayerDescriptor&#62;</pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Parcel Annotations in GeoServer (with some Maplex help)]]></title>
<link>http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help/</link>
<pubDate>Wed, 02 Feb 2011 04:33:02 +0000</pubDate>
<dc:creator>smathermather</dc:creator>
<guid>http://smathermather.wordpress.com/2011/02/01/parcel-annotations-in-geoserver-with-some-maplex-help/</guid>
<description><![CDATA[smathermather: We have a guest blogger today&#8211; Ramon, a bright and hard-working intern I&#8217;]]></description>
<content:encoded><![CDATA[<p><strong>smathermather:</strong></p>
<p>We have a guest blogger today&#8211; Ramon, a bright and hard-working intern I&#8217;ve had the pleasure of working with for over a year.  If you&#8217;re looking for someone versed in Postgre/PostGIS/GeoServer/OpenLayers, Ramon&#8217;s been my rock as we&#8217;ve been building our internal system, doing everything from basic grunt work to esoteric trouble-shooting.  I&#8217;m trying hard not to fall on my face now that he&#8217;s moved on.</p>
<p>We wanted to take advantage of the advance labeling of Maplex for parcels in GeoServer.  GeoServer SLDs don&#8217;t yet (I think) have automatic rotation for best fit for polygons, but Maplex (an ESRI label extension that&#8217;s rolled in with the ArcINFO license in ArcGIS desktop) does.  Here&#8217;s how we took advantage of that:</p>
<p><strong>Ramon:</strong><br />
The general procedure to generate the attribute table is as follows: (Note: It is best to do this in sections because in the limitations of labels that could be generated per annotation feature)<br />
1) Generate the labels using Maplex as the label engine in Arcmap.<br />
2) Convert the labels into annotation (in a database)<br />
3) Join the annotation table back to the original polygon that needs labeled.<br />
4) Export the dataset to create a new shapefile with the combined attribute table of the original shapefile and &#8220;annotation feature&#8221;<br />
5) Import the shapefile to PostgreSQL</p>
<p>Notes: I added the following fields to the shapefie before importing it to PostgreSQL<br />
a) acreage &#8211; area of the parcel in acres<br />
b) res_prop &#8211; &#8220;Y&#8221; if parcel is within 1500 ft of our area of interest, otherwise &#8220;N&#8221;<br />
c) ang &#8211; small integer conversion of the &#8220;Angle&#8221; value generated by Maplex (this may be scrapped from the workflow in the future)<br />
d) Rot_Ang &#8211; the rotation angle in terms of Geoserver convention.<br />
- calculated as &#8220;zero&#8221; minus &#8220;ang&#8221; (see the UPDATE SQL below)<br />
e.g. UPDATE base.parcel_annotations_med SET rot_ang = 0 &#8211; ang;</p>
<p><strong>smathermather:</strong></p>
<p>This final step step converts annotation rotation values, which are rotated from horizontal up to 90 degrees either in a positive or negative to GeoServer label rotation convention, which run the full arc of a circle.</p>
<p>We&#8217;ll have a post that follows with the final SLD, and screen shot of the great labeling effect.  Stay posted.</p>
]]></content:encoded>
</item>

</channel>
</rss>
