simstadt_openlayers.js 9.49 KB
Newer Older
1
2
3
4
//TODO: Add zoom to extent as control
//TODO: Try to leave everything in 4326 

var reset_btn = $('#reset')[0];
5
6
7
var novafactory_btn = $('#nfDownload')[0];
var dataPanel = $('#dataPanel');
var br = document.createElement('br');
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
48
49

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)'
		})
	})
});

50
51
52
53
54
55
56
57
58
59
60
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,
	}));
}

61
62
// vectorSource.addMarker(3536859.19, 5438902.94, "BRUSE");
// vectorSource.addMarker(3533399.8907172694, 5439126.050470325, "MyPoly");
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
111
112
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()
});

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

duminil's avatar
duminil committed
121
122
123
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
124
125
});

126
function updateGMLPolygons() {
duminil's avatar
duminil committed
127
128
129
	kml_source.forEachFeature(function(feature) {
		feature["geoJSON"] = geoJSONformat.writeFeatureObject(feature);
		feature["area"] = feature.getGeometry().getArea();
duminil's avatar
duminil committed
130
131
132
		var project = feature.get("project");
		var name = feature.get("name");
		feature["description"] = project + ">" + name;
duminil's avatar
duminil committed
133
134
		var citygmlHere;
		if (fromJavaFX) {
135
			citygmlHere = fxapp.checkIfCityGMLSAreAvailable(project, name);
duminil's avatar
duminil committed
136
137
138
		}
		feature["available"] = citygmlHere;
	});
duminil's avatar
duminil committed
139
}
duminil's avatar
duminil committed
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
188
189
// 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;
190
191
var fromJavaFX;

192
draw.on('drawstart', function(evt) {
193
	fromJavaFX = (typeof fxapp !== 'undefined');
194
195
	sketch = evt.feature;
	reset_btn.disabled = false;
duminil's avatar
duminil committed
196
	updateGMLPolygons();
197
198
199
200
201
202
203
204
});
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
205
206
	var i = 0;
	kml_source.forEachFeature(function(feature) {
207
		try {
duminil's avatar
duminil committed
208
			var jsonIntersection = turf.intersect(poly1, feature["geoJSON"]);
209
210
			if (undefined != jsonIntersection) {
				if (!intersection_found) {
211
					dataPanel.append("Intersection found with :<br/>\n");
212
213
214
215
					intersection_found = true;
				}
				var intersection = geoJSONformat.readFeature(jsonIntersection);
				var intersectionArea = intersection.getGeometry().getArea();
duminil's avatar
duminil committed
216
				var citygml_percentage = Math.round(intersectionArea / feature["area"] * 100);
217
218
219
				var sketch_percentage = Math.round(intersectionArea / sketch_area * 100);
				intersections.addFeature(intersection);

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

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

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

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

263
function displayInfo() {
264
//	var start = new Date().getTime();
265
	dataPanel.empty();
266
267
268
269
270
	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();
271
	if (!fromJavaFX) {
272
273
274
275
276
		var gsk3_coords = "";
		var wgs84_coords = "";
		var n = coords.length;
		for (var i = 0; i < n; i++) {
			var wgs84_coord = coords[i];
277
278
			// wgs84_coords += "regionPolygon.add(new Coord(" + wgs84_coord[1] +
			// "," + wgs84_coord[0] + "));<br/>";
279
280
281
282
283
			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/>";
		}
284
285
286
287
		dataPanel.append("WGS84 Coordinates<br/>");
		dataPanel.append(wgs84_coords + "<br/>\n");
		dataPanel.append("GSK3 Coordinates<br/>");
		dataPanel.append(gsk3_coords + "<br/>\n");
288
	}
289
290
	dataPanel.append("Area" + "<br/>\n");
	dataPanel.append((Math.round(area / 1000) / 10).toString() + " ha<br/><br/>\n");
291
	findIntersections();
292
293
294
//	var end = new Date().getTime();
//	var time = end - start;
//	console.log('Execution time: ' + time);
295
296
297
298
}

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

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

320
321
322
323
324
325
326
327
328
329
330
331
332
333
novafactory_btn.downloadFinished = function() {
	//FIXME: Weird <br>s are inserted between lines
	dataPanel.append("NovaFactory : DONE <br/>\n");
	this.disabled = false;
}

novafactory_btn.updateStatus = function(status) {
	dataPanel.append("NovaFactory : "+status+"<br/>\n");
}

$('#nfDownload').click(function() {
	novafactory_btn.disabled = true;
	dataPanel.append("NovaFactory BEGIN <br/>\n");
	fxapp.downloadRegion(sketchAsWKT('4326'), novafactory_btn);
duminil's avatar
duminil committed
334
335
});

336
337
function sketchAsWKT(epsgId) {
	var epsgId = (typeof epsgId === 'undefined') ? '31467' : epsgId;
338
	var wktFormat = new ol.format.WKT();
duminil's avatar
duminil committed
339
	return wktFormat.writeFeature(sketch, {
340
		dataProjection : ol.proj.get('EPSG:'+epsgId),
341
		featureProjection : ol.proj.get('EPSG:3857')
duminil's avatar
duminil committed
342
343
	})
}
344
345
346

function focusOnMap() {
	$('#map').focus();
duminil's avatar
duminil committed
347
	// $('#map').scrollIntoView();
348
349
}

duminil's avatar
duminil committed
350
focusOnMap();