[mapguide-users] Digitizing/Redlining: Draw a Rectangle composed
from Lines / Partly Java-implemention of LayerDefinitionFactory
Sicky
Christian.Rueh at rostock.zgdv.de
Fri Feb 26 07:19:15 EST 2010
>From the devguide examples I implemented a functionality to draw a rectangle
on the map. This partly implements the LayerDefinitionFactory in Java. It
works by drawing 4 lines which make up the rectangle.
You call the jsp froma page with this script:
<script language="javascript" type="text/javascript">
function DigitizeRectangle() {
parent.mapFrame.DigitizeRectangle(OnRectangleDigitized);
}
function OnRectangleDigitized(rect) {
// Send the Javascript variables to 'draw_rect.jsp' via the form
frame
// Vorher: var queryString =
window.top.location.search.substring(1);
var queryString =
window.parent.parent.location.search.substring(1);
var truffle_webapp_antrag_id = getParameter(queryString,
"truffle_webapp_antrag_id");
var truffle_webapp_session_id = getParameter(queryString,
"truffle_webapp_session_id");
var params = new Array("x0", rect.Point1.X,
"y0", rect.Point1.Y,
"x1", rect.Point2.X,
"y1", rect.Point2.Y,
"SESSION", this.sessionId,
"MAPNAME", this.mapName);
parent.formFrame.Submit("/mapguide/javatest/digitizing_features/draw_rect.jsp",
params, "scriptFrame");
}
</script>
draw_rect.jsp looks like this:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!--
// Copyright (C) 2004-2006 Autodesk, Inc.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of version 2.1 of the GNU Lesser
// General Public License as published by the Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
-->
<html>
<%@ page import="org.osgeo.mapguide.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.text.*" %>
<%@ page import="javax.servlet.jsp.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.StringWriter" %>
<%@ page import="javax.xml.parsers.DocumentBuilder" %>
<%@ page import="javax.xml.parsers.DocumentBuilderFactory" %>
<%@ page import="javax.xml.parsers.ParserConfigurationException" %>
<%@ page import="javax.xml.transform.OutputKeys" %>
<%@ page import="javax.xml.transform.Transformer" %>
<%@ page import="javax.xml.transform.TransformerException" %>
<%@ page import="javax.xml.transform.TransformerFactory" %>
<%@ page import="javax.xml.transform.TransformerFactoryConfigurationError"
%>
<%@ page import="javax.xml.transform.dom.DOMSource" %>
<%@ page import="javax.xml.transform.stream.StreamResult" %>
<%@ page import="org.w3c.dom.Document" %>
<%@ page import="org.w3c.dom.NodeList" %>
<%@ page import="org.xml.sax.SAXException" %>
<%@ include file="../common/common.jsp" %>
<head>
<title>Draw a Line</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="content-style-type" content="text/css">
<link href="../styles/globalStyles.css" rel="stylesheet"
type="text/css">
<link href="../styles/otherStyles.css" rel="stylesheet" type="text/css">
<script language="javascript" type="text/javascript">
function OnPageLoad()
{
parent.mapFrame.Refresh();
}
</script>
</head>
<body onLoad="OnPageLoad();">
<%
String sessionId = request.getParameter("SESSION");
String mapName = request.getParameter("MAPNAME");
String x0 = request.getParameter("x0");
String y0 = request.getParameter("y0");
String x1 = request.getParameter("x1");
String y1 = request.getParameter("y1");
try
{
// Initialize the Web Extensions and connect to the Server using
// the Web Extensions session identifier stored in PHP
// session state.
MapGuideJavaApi.MgInitializeWebTier(webconfigFilePath);
// Get the user information using the session id,
// and set up a connection to the site server.
MgUserInformation userInfo = new MgUserInformation(sessionId);
MgSiteConnection siteConnection = new MgSiteConnection();
siteConnection.Open(userInfo);
// Get an instance of the required service(s).
MgResourceService resourceService = (MgResourceService)
siteConnection.CreateService(MgServiceType.ResourceService);
MgFeatureService featureService = (MgFeatureService)
siteConnection.CreateService(MgServiceType.FeatureService);
MgMap map = new MgMap();
map.Open(resourceService, mapName);
//Constants for the new Layer
String layerName = "Lines";
String layerLegendLabel = "New Rectangle";
String groupName = "Analysis";
String groupLegendLabel = "Analysis";
// Does the temporary feature source already exist?
// If not, create it
String featureSourceName = "Session:" + sessionId +
"//TemporaryLines.FeatureSource";
//String featureSourceName =
"Library://APITest/LineTest/TemporaryLines.FeatureSource";
MgResourceIdentifier resourceIdentifier = new
MgResourceIdentifier(featureSourceName);
//Wether or not the featureSource exists, it should always be deleted
//Thats because when the user draws a new rectangle the old one should
vanish
resourceService.DeleteResource(resourceIdentifier);
// Create a temporary feature source to draw the lines on
// Create a feature class definition for the new feature source
MgClassDefinition classDefinition = new MgClassDefinition();
classDefinition.SetName(layerName);
classDefinition.SetDescription("Lines to display.");
String geometryPropertyName="SHPGEOM";
classDefinition.SetDefaultGeometryPropertyName(geometryPropertyName);
// Create an identity property
MgDataPropertyDefinition identityProperty = new
MgDataPropertyDefinition("KEY");
identityProperty.SetDataType(MgPropertyType.Int32);
identityProperty.SetAutoGeneration(true);
identityProperty.SetReadOnly(true);
// Add the identity property to the class definition
classDefinition.GetIdentityProperties().Add(identityProperty);
classDefinition.GetProperties().Add(identityProperty);
// Create a name property
MgDataPropertyDefinition nameProperty = new
MgDataPropertyDefinition("NAME");
nameProperty.SetDataType(MgPropertyType.String);
// Add the name property to the class definition
classDefinition.GetProperties().Add(nameProperty);
// Create a geometry property
MgGeometricPropertyDefinition geometryProperty = new
MgGeometricPropertyDefinition(geometryPropertyName);
geometryProperty.SetGeometryTypes(MgFeatureGeometricType.Surface);
// Add the geometry property to the class definition
classDefinition.GetProperties().Add(geometryProperty);
// Create a feature schema
MgFeatureSchema featureSchema = new MgFeatureSchema("SHP_Schema",
"Line schema");
// Add the feature schema to the class definition
featureSchema.GetClasses().Add(classDefinition);
// Create the feature source
String wkt = map.GetMapSRS();
MgCreateSdfParams sdfParams = new MgCreateSdfParams("spatial context",
wkt, featureSchema);
featureService.CreateFeatureSource(resourceIdentifier, sdfParams);
// Add the line to the feature source
MgBatchPropertyCollection batchPropertyCollection = new
MgBatchPropertyCollection();
MgPropertyCollection propertyCollection = MakeRect("Rect A", x0, y0,
x1, y1);
batchPropertyCollection.Add(propertyCollection);
// Add the batch property collection to the feature source
MgInsertFeatures cmd = new MgInsertFeatures(layerName,
batchPropertyCollection);
MgFeatureCommandCollection featureCommandCollection = new
MgFeatureCommandCollection();
featureCommandCollection.Add(cmd);
// Execute the "add" commands
featureService.UpdateFeatures(resourceIdentifier,
featureCommandCollection, false);
boolean layerExists = DoesLayerExist(layerName, map);
if (!layerExists)
{
// Create a new layer which uses that feature source
// Create a line rule to stylize the lines
String ruleLegendLabel = "Lines Rule";
String filter = "";
String color = "FF0000FF";
//LayerDefinitionFactory factory = new LayerDefinitionFactory();
String lineRule = createLineRule(ruleLegendLabel, filter, color);
// Create a line type style
String lineTypeStyle = createLineTypeStyle(lineRule);
// Create a scale range
String minScale = "0";
String maxScale = "1000000000000";
String lineScaleRange = createScaleRange(minScale, maxScale,
lineTypeStyle);
// Create the layer definiton
String featureName = "SHP_Schema:Lines";
String geometry = "SHPGEOM";
String layerDefinition = createLayerDefinition(featureSourceName,
featureName, geometry, lineScaleRange);
//---------------------------------------------------//
// Add the layer to the map
MgLayer newLayer = add_layer_definition_to_map(layerDefinition,
layerName, layerLegendLabel, sessionId, resourceService, map);
// Add the layer to a layer group
add_layer_to_group(newLayer, groupName, groupLegendLabel, map);
}
// Turn on the visibility of this layer.
// (If the layer does not already exist in the map, it will be visible
by default when it is added.
// But if the user has already run this script, he or she may have set
the layer to be invisible.)
MgLayerCollection layerCollection = map.GetLayers();
if (layerCollection.Contains(layerName))
{
MgLayer linesLayer = (MgLayer) layerCollection.GetItem(layerName);
linesLayer.SetVisible(true);
}
MgLayerGroupCollection groupCollection = map.GetLayerGroups();
if (groupCollection.Contains(groupName))
{
MgLayerGroup analysisGroup = groupCollection.GetItem(groupName);
analysisGroup.SetVisible(true);
}
//---------------------------------------------------//
// Save the map back to the session repository
String sessionIdName = "Session:" + sessionId + "//" + mapName +
".Map";
//String sessionIdName =
"Library://APITest/LineTest/TemporaryLines.Map";
MgResourceIdentifier sessionResourceID = new
MgResourceIdentifier(sessionIdName);
sessionResourceID.Validate();
map.Save(resourceService, sessionResourceID);
}
catch (MgLayerNotFoundException e)
{
out.println("<p>Layer not found</p>");
}
catch (MgObjectNotFoundException e)
{
out.println("<p>Layer not found</p>");
}
catch (MgException e)
{
out.println(e.GetMessage());
out.println(e.GetDetails());
}
%>
<%!
private static boolean DoesLayerExist(String layerName, MgMap map) throws
MgException
{
MgLayerCollection layerCollection = map.GetLayers();
return(layerCollection.Contains(layerName) ? true : false ) ;
}
private static MgPropertyCollection MakeRect(String name, String x0, String
y0 , String x1, String y1) throws MgException
{
MgPropertyCollection propertyCollection = new MgPropertyCollection();
MgStringProperty nameProperty = new MgStringProperty("NAME", name);
propertyCollection.Add(nameProperty);
MgAgfReaderWriter agfReaderWriter = new MgAgfReaderWriter();
MgMultiLineString mls = createMultiLineStringXY(x0, y0, x1, y1);
MgByteReader geometryByteReader = agfReaderWriter.Write(mls);
MgGeometryProperty geometryProperty = new MgGeometryProperty("SHPGEOM",
geometryByteReader);
propertyCollection.Add(geometryProperty);
return propertyCollection;
}
private static MgMultiLineString createMultiLineStringXY(String x0, String
y0, String x1, String y1) throws MgException
{
MgGeometryFactory geometryFactory = new MgGeometryFactory();
MgLineStringCollection lines = new MgLineStringCollection();
//left
lines.Add(createLineStringXY(x0, y0, x0, y1));
//right
lines.Add(createLineStringXY(x1, y0, x1, y1));
//up
lines.Add(createLineStringXY(x0, y0, x1, y0));
//down
lines.Add(createLineStringXY(x0, y1, x1, y1));
return geometryFactory.CreateMultiLineString(lines);
}
private static MgLineString createLineStringXY(String x0, String y0, String
x1, String y1) throws MgException
{
double x0d = Double.valueOf(x0).doubleValue();
double y0d = Double.valueOf(y0).doubleValue();
double x1d = Double.valueOf(x1).doubleValue();
double y1d = Double.valueOf(y1).doubleValue();
MgGeometryFactory geometryFactory = new MgGeometryFactory();
MgCoordinateCollection coords = new MgCoordinateCollection();
coords.Add(geometryFactory.CreateCoordinateXY(x0d, y0d));
coords.Add(geometryFactory.CreateCoordinateXY(x1d, y1d));
return geometryFactory.CreateLineString(coords);
}
private static MgLayer add_layer_definition_to_map(String layerDefinition,
String layerName, String layerLegendLabel, String sessionId,
MgResourceService resourceService, MgMap map) throws MgException {
//Adds the layer definition (XML) to the map.
//Returns the layer.
// Save the new layer definition to the session repository
//MgByteSource(ByteArray, Int) -> layerDefinition.getBytes()
MgByteSource byteSource = new MgByteSource(layerDefinition.getBytes(),
layerDefinition.length());
byteSource.SetMimeType(MgMimeType.Xml);
MgResourceIdentifier resourceID = new MgResourceIdentifier("Session:" +
sessionId + "//" + layerName + ".LayerDefinition");
//MgResourceIdentifier resourceID = new
MgResourceIdentifier("Library://APITest/LineTest/TemporaryLines.LayerDefinition");
resourceService.SetResource(resourceID, byteSource.GetReader(), null);
MgLayer newLayer = add_layer_resource_to_map(resourceID, resourceService,
layerName, layerLegendLabel, map);
return newLayer;
}
private static MgLayer add_layer_resource_to_map(MgResourceIdentifier
layerResourceID, MgResourceService resourceService, String layerName, String
layerLegendLabel, MgMap map) throws MgException
//Adds a layer defition (which can be stored either in the Library or a
session repository) to the map.
//Returns the layer.
{
MgLayer newLayer = new MgLayer(layerResourceID, resourceService);
//Add the new layer to the map's layer collection
newLayer.SetName(layerName);
newLayer.SetVisible(true);
newLayer.SetLegendLabel(layerLegendLabel);
newLayer.SetDisplayInLegend(true);
MgLayerCollection layerCollection = map.GetLayers();
if (!layerCollection.Contains(layerName) )
{
// Insert the new layer at position 0 so it is at the top of the drawing
order
layerCollection.Insert(0, newLayer);
}
return newLayer;
}
public static void add_layer_to_group(MgLayer layer, String layerGroupName,
String layerGroupLegendLabel, MgMap map) throws MgException
//Adds a layer to a layer group. If necessary, it creates the layer group.
{
//Get the layer group
MgLayerGroupCollection layerGroupCollection = map.GetLayerGroups();
MgLayerGroup layerGroup = null;
if (layerGroupCollection.Contains(layerGroupName))
{
layerGroup = layerGroupCollection.GetItem(layerGroupName);
}
else
{
// It does not exist, so create it
layerGroup = new MgLayerGroup(layerGroupName);
layerGroup.SetVisible(true);
layerGroup.SetDisplayInLegend(true);
layerGroup.SetLegendLabel(layerGroupLegendLabel);
layerGroupCollection.Add(layerGroup);
}
//Add the layer to the group
layer.SetGroup(layerGroup);
}
//Creates line rule
//Parameters:
//$color - color code for the line
//$legendLabel - string for the legend label
//$filter - filter string
public static String createLineRule(String legendLabel, String filter,
String color) throws ParserConfigurationException, SAXException, IOException
{
String linerule =
readFileAsString("c:\\Programme\\_gis\\OSGeo\\MapGuide\\Web\\www\\viewerfiles\\linerule.templ");
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb, Locale.GERMANY);
formatter.format(linerule, legendLabel, filter, color);
linerule = formatter.toString();
return linerule;
}
//Creates LineTypeStyle
//Parameters:
//$lineRules - call CreateLineRule to create line rules
public static String createLineTypeStyle(String lineRules) throws
ParserConfigurationException, SAXException, IOException
{
String linestyle =
readFileAsString("c:\\Programme\\_gis\\OSGeo\\MapGuide\\Web\\www\\viewerfiles\\linetypestyle.templ");
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb, Locale.GERMANY);
formatter.format(linestyle, lineRules);
linestyle = formatter.toString();
return linestyle;
}
//Creates ScaleRange
//Parameterss
//$minScale - minimum scale
//$maxScale - maximum scale
//$typeStyle - use one CreateAreaTypeStyle, CreateLineTypeStyle, or
CreatePointTypeStyle
public static String createScaleRange(String minScale, String maxScale,
String typeStyle) throws ParserConfigurationException, SAXException,
IOException
{
String scaleRange =
readFileAsString("c:\\Programme\\_gis\\OSGeo\\MapGuide\\Web\\www\\viewerfiles\\scalerange.templ");
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb, Locale.GERMANY);
formatter.format(scaleRange, minScale, maxScale, typeStyle);
scaleRange = formatter.toString();
return scaleRange;
}
//Creates a layer definition
//$resourceId - resource identifier for the new layer
//featureClass - the name of the feature class
//$geometry - the name of the geometry
//$featureClassRange - use CreateScaleRange to define it.
public static String createLayerDefinition(String resourceId, String
featureClass, String geometry, String featureClassRange) throws
ParserConfigurationException, SAXException, IOException
{
String layerDef =
readFileAsString("c:\\Programme\\_gis\\OSGeo\\MapGuide\\Web\\www\\viewerfiles\\layerdefinition.templ");
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb, Locale.GERMANY);
formatter.format(layerDef, resourceId, featureClass, geometry,
featureClassRange);
layerDef = formatter.toString();
return layerDef;
}
private static String readFileAsString(String filePath) throws
java.io.IOException{
byte[] buffer = new byte[(int) new File(filePath).length()];
BufferedInputStream f = new BufferedInputStream(new
FileInputStream(filePath));
f.read(buffer);
return new String(buffer);
}
%>
</body>
</html>
maybe this is helpful to somebody :)
And before I forget it, I have some unsolved MGOS problems here:
http://n2.nabble.com/SetSelectionXML-Problem-Selection-and-Zoom-to-selected-Feature-td4585892.html
and here:
http://n2.nabble.com/CoordinateSystem-Problems-with-Data-from-WMS-EPSG-31468-and-2398-td4461491.html
--
View this message in context: http://n2.nabble.com/Digitizing-Redlining-Draw-a-Rectangle-composed-from-Lines-Partly-Java-implemention-of-LayerDefinitioy-tp4638735p4638735.html
Sent from the MapGuide Users mailing list archive at Nabble.com.
More information about the mapguide-users
mailing list