[OpenLayers-Users] Split a line feature with a MultiLineString
sendeman
martijnsendenspam at gmail.com
Mon Dec 14 11:29:57 EST 2009
Hi All,
I have an OpenLayers application that in which I have an XYZ-subsurface
model residing in a MySQL database table. The model has a record for each
voxel that has an X, Y and Z value and a value that indicates the soil type
(e.g. 1 for clay, 2 for loam, etcetera).
Using php, jQuery and OpenLayers I am able to retrieve all the relevant
records for a location when a user clicks on the map. The php script returns
a column with all the soillayers.
Now what I also want to do is create the possibility for a user to draw a
section line on the map and then get a vertical cross-section from the
XYZ-model. To do this I mean to let the user draw a line and using the
featureadded event I want to split the drawn line at every intersection with
the grid of the XYZ model.
I thought this should be possible with the
http://dev.openlayers.org/docs/files/OpenLayers/Geometry/MultiLineString-js.html#OpenLayers.Geometry.MultiLineString.split
split function for the MultiLineString . I built a WKT-string to create a
MultiLineString for the grid. I have added the cell size as a variable to
the script, so it will be reusable for models with different cell sizes. I
want to intersect the drawn line with the created grid. This doesn't work. I
get an error in Firebug:
SectionGridFeature.split is not a function
http://localhost/geoviewer/javascript/crosssection.js
Line 75 ed. This would be the line stating:
'SectionGridFeature.split(varSections.features[0]);'
For the script I made, see below. This doesn't include the entire openlayers
script I built, but just the section I'm using for the creation of the
cross-section.
My question is: how can I make the split function work? I fear something may
be wrong with the MultiLineString...
Best regards,
Martijn Senden.
// JavaScript Document for drawing profile lines that are used for drawing
// cross-sections through the Rockworks XYZ-model in the MWH Geoviewer
// V. 1.0 By Martijn Senden, MWH B.V., The Netherlands
// Project parameters
var CellSize = 10; //Size of the grid cells in the XYZ-model
// Stylemap for Cross-section line
function initCrossSection() {
var StyleCustomCrossSectionLine = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
strokeColor: "#ffff00",
strokeWidth: 2.5
})
});
var StyleCustomGrid = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
strokeColor: "#ffff00",
fillColor: "#ffbb00",
strokeWidth: 2.5
})
});
// Addition of cross-section layer to map and enter drawing mode
var varSections = new OpenLayers.Layer.Vector("Section Line", {
visibility: true, styleMap: StyleCustomCrossSectionLine});
map.addLayer(varSections);
var varSection = new OpenLayers.Control.DrawFeature(
varSections,
OpenLayers.Handler.Path,
{displayClass: 'olControlDrawFeaturePolygon'}
);
varSections.events.on({
//Delete previous line before new feature is added
"beforefeatureadded": function(evt) {
var i, len, toDestroy = []
for(i=0,len=varSections.features.length; i<len; i++) {
if(varSections.features[i] != evt.feature) {
toDestroy.push(varSections.features[i]);
}
}
varSections.destroyFeatures(toDestroy);
},
//When new feature is added:
"featureadded": function(evt) {
//Get Xmin, Xmax, Ymin and Ymax for the new grid used for intersection
var SectionBounds =
varSections.features[0].geometry.getBounds().clone();
var vXmin = RoundToGrid(SectionBounds.left,CellSize,"Up");
var vXmax = RoundToGrid(SectionBounds.right,CellSize,"Down");
var vYmin = RoundToGrid(SectionBounds.bottom,CellSize,"Up");
var vYmax = RoundToGrid(SectionBounds.top,CellSize,"Down");
//Create intersection polygon grid
var varSectionGrid = new OpenLayers.Layer.Vector("Section Gridpunten",
{visibility: true, styleMap: StyleCustomGrid});
parser = new OpenLayers.Format.WKT();
var wkt = " MULTILINESTRING(";
//Draw vertical lines
for (y = vYmin; y < vYmax; y = y + CellSize) {
wkt = wkt+"("+vXmin+" "+y+")("+vXmax+" "+y+")";
}
//Draw horizontal lines
for (x = vXmin; x < vXmax; x = x + CellSize) {
wkt = wkt+"("+x+" "+vYmin+")("+x+" "+vYmax+")";
}
var SectionGridGeometry = parser.read(wkt);
var SectionGridFeature = new
OpenLayers.Feature.Vector(SectionGridGeometry);
varSectionGrid.addFeatures(SectionGridFeature);
//Split the Section line with the temporary grid
SectionGridFeature.split(varSections.features[0]);
varSectionGrid.features[0].geometry.split(varSections.features[0]);
//Construct Json-string from the coordinates of the vertices of the
drawn section line
varSectionCoords = '{';
for (var i = 0; i < varSections.features[0].geometry.components.length
- 1; i++) {
varSectionCoords = varSectionCoords + '"point' + '":{"x":"' +
varSections.features[0].geometry.components[i].x + '","y":"' +
varSections.features[0].geometry.components[i].y + '"},';
}
varSectionCoords = varSectionCoords + '"point' + '":{"x":"' +
varSections.features[0].geometry.components[varSections.features[0].geometry.components.length
- 1].x + '","y":"' +
varSections.features[0].geometry.components[varSections.features[0].geometry.components.length
- 1].y + '"}}';
}
});
map.addControl(varSection);
varSection.activate();
}
function RoundToGrid(Value, GridResolution, Type) {
switch (Type) {
case "Up":
return Math.ceil(Value / GridResolution)*GridResolution;
break;
case "Down":
return Math.floor(Value / GridResolution)*GridResolution;
break;
case "Round":
return Math.round(Value / GridResolution)*GridResolution;
break;
}
}
--
View this message in context: http://n2.nabble.com/Split-a-line-feature-with-a-MultiLineString-tp4165167p4165167.html
Sent from the OpenLayers Users mailing list archive at Nabble.com.
More information about the Users
mailing list