simstadt_openlayers.js 9.02 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//TODO: Add zoom to extent as control
//TODO: Try to leave everything in 4326 

var reset_btn = $('#reset')[0];
var send_btn = $('#send')[0];

proj4.defs("EPSG:31467", "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0"
		+ " +ellps=bessel +datum=potsdam +units=m +no_defs"); // http://spatialreference.org/ref/epsg/31467/proj4js/

var wgs84Sphere = new ol.Sphere(6378137);

var osm_layer = new ol.layer.Tile({
	source : new ol.source.OSM()
});

var kml_source = new ol.source.KML({
	projection : ol.proj.get('EPSG:3857'),
	url : 'data/citygml_hulls.kml',
	extractAttributes : false,
	extractStyles : false
})

var kml_layer = new ol.layer.Vector({
	source : kml_source,
	style : new ol.style.Style({
		fill : new ol.style.Fill({
			color : 'rgba(255, 255, 255, 0.2)'
		}),
		stroke : new ol.style.Stroke({
			color : '#777777',
			width : 2,
			lineDash : [ 5, 10 ]
		}),
	})
});

var intersections = new ol.source.Vector();

var intersections_layer = new ol.layer.Vector({
	source : intersections,
	style : new ol.style.Style({
		fill : new ol.style.Fill({
			color : 'rgba(255, 155, 51, 0.5)'
		})
	})
});

48
49
50
51
52
53
54
55
56
57
58
var vectorSource = new ol.source.Vector({
	features : []
});

vectorSource.addMarker = function(x, y, name) {
	this.addFeature(new ol.Feature({
		geometry : new ol.geom.Point(ol.proj.transform([ x, y ], 'EPSG:31467', 'EPSG:3857')),
		name : name,
	}));
}

59
60
// vectorSource.addMarker(3536859.19, 5438902.94, "BRUSE");
// vectorSource.addMarker(3533399.8907172694, 5439126.050470325, "MyPoly");
61

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
var createTextStyle = function(feature, resolution) {
	var align = "Normal";
	var baseline = "Middle";
	var size = "12px";
	var weight = "Normal";
	var font = weight + ' ' + size + ' ' + "Arial";
	var fillColor = '#aa3300';
	var outlineColor = "#ffffff";
	var outlineWidth = 3;

	return new ol.style.Text({
		textAlign : align,
		textBaseline : baseline,
		font : font,
		text : feature.get('name'),
		fill : new ol.style.Fill({
			color : fillColor
		}),
		stroke : new ol.style.Stroke({
			color : outlineColor,
			width : outlineWidth
		}),
	});
};

var createPointStyleFunction = function() {
	return function(feature, resolution) {
		var style = new ol.style.Style({
			image : new ol.style.Circle({
				radius : 10,
				fill : new ol.style.Fill({
					color : 'rgba(255, 0, 0, 0.1)'
				}),
				stroke : new ol.style.Stroke({
					color : 'red',
					width : 1
				})
			}),
			text : createTextStyle(feature, resolution)
		});
		return [ style ];
	};
};

var labels = new ol.layer.Vector({
	source : vectorSource,
	style : createPointStyleFunction()
});

111
112
var map = new ol.Map({
	target : 'map',
113
	layers : [ osm_layer, kml_layer, intersections_layer, labels ],
114
115
116
	interactions : ol.interaction.defaults({
		keyboard : true
	})
117
118
});

duminil's avatar
duminil committed
119
120
121
var geoJSONformat = new ol.format.GeoJSON();
kml_layer.addEventListener("change", function(event) {
	map.getView().fitExtent(kml_source.getExtent(), (map.getSize()));
duminil's avatar
duminil committed
122
123
});

124
function updateGMLPolygons() {
duminil's avatar
duminil committed
125
126
127
	kml_source.forEachFeature(function(feature) {
		feature["geoJSON"] = geoJSONformat.writeFeatureObject(feature);
		feature["area"] = feature.getGeometry().getArea();
duminil's avatar
duminil committed
128
129
130
		var project = feature.get("project");
		var name = feature.get("name");
		feature["description"] = project + ">" + name;
duminil's avatar
duminil committed
131
132
		var citygmlHere;
		if (fromJavaFX) {
133
			citygmlHere = fxapp.checkIfCityGMLSAreAvailable(project, name);
duminil's avatar
duminil committed
134
135
136
		}
		feature["available"] = citygmlHere;
	});
duminil's avatar
duminil committed
137
}
duminil's avatar
duminil committed
138

139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
// The features are not added to a regular vector layer/source,
// but to a feature overlay which holds a collection of features.
// This collection is passed to the modify and also the draw
// interaction, so that both can add or modify features.
var featureOverlay = new ol.FeatureOverlay({
	style : new ol.style.Style({
		fill : new ol.style.Fill({
			color : 'rgba(255, 155, 51, 0.5)'
		}),
		stroke : new ol.style.Stroke({
			color : '#ffcc33',
			width : 4
		}),
		image : new ol.style.Circle({
			radius : 5,
			fill : new ol.style.Fill({
				color : '#ffcc33'
			})
		})
	})
});
featureOverlay.setMap(map);

var selected_features = featureOverlay.getFeatures();
selected_features.on('add', function(event) {
	var feature = event.element;
	feature.on("change", function(event) {
		displayInfo();
	});
});

var modify = new ol.interaction.Modify({
	features : featureOverlay.getFeatures(),
	// the SHIFT key must be pressed to delete vertices, so
	// that new vertices can be drawn at the same position
	// of existing vertices
	deleteCondition : function(event) {
		return ol.events.condition.shiftKeyOnly(event) && ol.events.condition.singleClick(event);
	}
});
map.addInteraction(modify);

draw = new ol.interaction.Draw({
	features : featureOverlay.getFeatures(),
	type : 'Polygon'
});
map.addInteraction(draw);

var sketch;
188
189
var fromJavaFX;

190
draw.on('drawstart', function(evt) {
191
	fromJavaFX = (typeof fxapp !== 'undefined');
192
193
	sketch = evt.feature;
	reset_btn.disabled = false;
duminil's avatar
duminil committed
194
	updateGMLPolygons();
195
196
197
198
199
200
201
202
});
var sourceProj = map.getView().getProjection();

function findIntersections() {
	var sketch_area = sketch.getGeometry().getArea();
	var poly1 = geoJSONformat.writeFeatureObject(sketch);
	var intersection_found = false;
	intersections.clear();
duminil's avatar
duminil committed
203
204
	var i = 0;
	kml_source.forEachFeature(function(feature) {
205
		try {
duminil's avatar
duminil committed
206
			var jsonIntersection = turf.intersect(poly1, feature["geoJSON"]);
207
208
209
210
211
212
213
			if (undefined != jsonIntersection) {
				if (!intersection_found) {
					$('#dataPanel').append("Intersection found with :<br/>\n");
					intersection_found = true;
				}
				var intersection = geoJSONformat.readFeature(jsonIntersection);
				var intersectionArea = intersection.getGeometry().getArea();
duminil's avatar
duminil committed
214
				var citygml_percentage = Math.round(intersectionArea / feature["area"] * 100);
215
216
217
				var sketch_percentage = Math.round(intersectionArea / sketch_area * 100);
				intersections.addFeature(intersection);

duminil's avatar
duminil committed
218
219
				var description;
				if (feature["available"]) {
duminil's avatar
duminil committed
220
221
					description = "<a href=\"#\" onclick=\"downloadRegionFromCityGML(" + i + ");return false;\">"
							+ feature["description"] + "</a>";
duminil's avatar
duminil committed
222
				} else {
duminil's avatar
duminil committed
223
					description = feature['description'];
duminil's avatar
duminil committed
224
225
226
				}

				$('#dataPanel').append(description + " (" + citygml_percentage + "%");
227
228
229
230
231
232
233
234
235
				if (sketch_percentage == 100) {
					$('#dataPanel').append(", all inside");
				}
				$('#dataPanel').append(")<br/>\n");
			}

		} catch (err) {
			console.log(feature.get('description') + " - " + err);
		}
duminil's avatar
duminil committed
236
237
		i++;
	})
238
239
240
241
	if (!intersection_found) {
		$('#dataPanel').append("No intersection found with any CityGML<br/>\n");
	}
}
duminil's avatar
duminil committed
242
243

function downloadRegionFromCityGML(i) {
244
	// TODO: Disable all links
245
	$("html").addClass("wait");
duminil's avatar
duminil committed
246
	var feature = kml_source.getFeatures()[i];
247
248
249
	// Waiting 100ms in order to let the cursor change
	setTimeout(function() {
		var start = new Date().getTime();
duminil's avatar
duminil committed
250
		fxapp.downloadRegionFromCityGML(sketchAsWKT(), feature.get("project"), feature.get("name"), vectorSource);
251
252
253
		var end = new Date().getTime();
		var time = end - start;
		console.log('DL Execution time: ' + time);
254
255
256
257
		setTimeout(function() {
			$("html").removeClass("wait");
			$("#dataPanel").append("Done<br/>\n");
		}, 100);
258
	}, 100);
duminil's avatar
duminil committed
259
260
}

261
262
263
264
265
266
267
268
function displayInfo() {
	var start = new Date().getTime();
	$('#dataPanel').empty();
	var geom = /** @type {ol.geom.Polygon} */
	(sketch.getGeometry().clone().transform(sourceProj, 'EPSG:4326'));
	var coordinates = geom.getLinearRing(0).getCoordinates();
	var area = Math.abs(wgs84Sphere.geodesicArea(coordinates));
	var coords = geom.getLinearRing(0).getCoordinates();
269
	if (!fromJavaFX) {
270
271
272
273
274
		var gsk3_coords = "";
		var wgs84_coords = "";
		var n = coords.length;
		for (var i = 0; i < n; i++) {
			var wgs84_coord = coords[i];
275
276
			// wgs84_coords += "regionPolygon.add(new Coord(" + wgs84_coord[1] +
			// "," + wgs84_coord[0] + "));<br/>";
277
278
279
280
281
			wgs84_coords += "(" + wgs84_coord[1] + "," + wgs84_coord[0] + ")<br/>";

			var gsk3_coord = ol.proj.transform(coords[i], ol.proj.get('EPSG:4326'), ol.proj.get('EPSG:31467'))
			gsk3_coords += "(" + gsk3_coord[0] + "," + gsk3_coord[1] + ")<br/>";
		}
282
283
284
285
286
		$('#dataPanel').append("WGS84 Coordinates<br/>");
		$('#dataPanel').append(wgs84_coords + "<br/>\n");
		$('#dataPanel').append("GSK3 Coordinates<br/>");
		$('#dataPanel').append(gsk3_coords + "<br/>\n");
	}
287
288
289
290
291
292
293
294
295
296
	$('#dataPanel').append("Area" + "<br/>\n");
	$('#dataPanel').append((Math.round(area / 1000) / 10).toString() + " ha<br/><br/>\n");
	findIntersections();
	var end = new Date().getTime();
	var time = end - start;
	console.log('Execution time: ' + time);
}

draw.on('drawend', function(e) {
	displayInfo();
297
298
299
300
	if (fromJavaFX) {
		send_btn.disabled = false;
	}
	draw.setActive(false);
301
302
303
});

$('#reset').click(function() {
duminil's avatar
duminil committed
304
305
306
307
	try {
		draw.finishDrawing();
	} finally {
		$('#dataPanel').empty();
308
		$("html").removeClass("wait");
309
		draw.setActive(true);
duminil's avatar
duminil committed
310
311
312
313
		featureOverlay.getFeatures().clear();
		intersections.clear();
		reset_btn.disabled = true;
		send_btn.disabled = true;
314
		focusOnMap();
duminil's avatar
duminil committed
315
	}
316
317
318
});

$('#send').click(function() {
duminil's avatar
duminil committed
319
320
321
322
323
	focusOnMap();
	fxapp.downloadRegion(sketchAsWKT());
});

function sketchAsWKT() {
324
	var wktFormat = new ol.format.WKT();
duminil's avatar
duminil committed
325
	return wktFormat.writeFeature(sketch, {
326
		dataProjection : ol.proj.get('EPSG:31467'),
327
		featureProjection : ol.proj.get('EPSG:3857')
duminil's avatar
duminil committed
328
329
	})
}
330
331
332

function focusOnMap() {
	$('#map').focus();
duminil's avatar
duminil committed
333
	// $('#map').scrollIntoView();
334
335
}

duminil's avatar
duminil committed
336
focusOnMap();