simstadt_openlayers.js 9.13 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

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

25
var polygon_style =new ol.style.Style({
26
27
28
29
30
31
32
33
34
		fill : new ol.style.Fill({
			color : 'rgba(255, 255, 255, 0.2)'
		}),
		stroke : new ol.style.Stroke({
			color : '#777777',
			width : 2,
			lineDash : [ 5, 10 ]
		}),
	})
35
36
37
38

var kml_layer = new ol.layer.Vector({
	source : kml_source,
	style : polygon_style
39
40
41
42
43
44
45
46
47
48
49
50
51
});

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

52
var novafactory_vectors = new ol.source.Vector({
53
54
55
	features : []
});

56
57
58
59
60
novafactory_vectors.addMarker = function(xmin, ymin, xmax, ymax, name) {
	var p1 = new ol.geom.Point(ol.proj.transform([ xmin, ymin ], 'EPSG:31467', 'EPSG:3857'))
	var p2 = new ol.geom.Point(ol.proj.transform([ xmin, ymax ], 'EPSG:31467', 'EPSG:3857'))
	var p3 = new ol.geom.Point(ol.proj.transform([ xmax, ymax ], 'EPSG:31467', 'EPSG:3857'))
	var p4 = new ol.geom.Point(ol.proj.transform([ xmax, ymin ], 'EPSG:31467', 'EPSG:3857'))
61
	this.addFeature(new ol.Feature({
62
		geometry : new ol.geom.Polygon([[p1,p2,p3,p4,p1]]),
63
64
65
66
		name : name,
	}));
}

67
68
69
70
71
novafactory_vectors.addMarker(3530000,5434300,3538800,5445010,"WU");

var novafactory_layer = new ol.layer.Vector({
	source : novafactory_vectors,
//	style: polygon_style
72
73
});

74
75
var map = new ol.Map({
	target : 'map',
76
	layers : [ osm_layer, kml_layer, novafactory_layer, intersections_layer],
77
78
79
	interactions : ol.interaction.defaults({
		keyboard : true
	})
80
81
});

duminil's avatar
duminil committed
82
83
84
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
85
86
});

87
function updateGMLPolygons() {
duminil's avatar
duminil committed
88
89
90
	kml_source.forEachFeature(function(feature) {
		feature["geoJSON"] = geoJSONformat.writeFeatureObject(feature);
		feature["area"] = feature.getGeometry().getArea();
duminil's avatar
duminil committed
91
92
93
		var project = feature.get("project");
		var name = feature.get("name");
		feature["description"] = project + ">" + name;
duminil's avatar
duminil committed
94
95
		var citygmlHere;
		if (fromJavaFX) {
96
			citygmlHere = fxapp.checkIfCityGMLSAreAvailable(project, name);
duminil's avatar
duminil committed
97
98
99
		}
		feature["available"] = citygmlHere;
	});
duminil's avatar
duminil committed
100
}
duminil's avatar
duminil committed
101

102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// 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;
151
152
var fromJavaFX;

153
draw.on('drawstart', function(evt) {
154
	fromJavaFX = (typeof fxapp !== 'undefined');
155
156
	sketch = evt.feature;
	reset_btn.disabled = false;
duminil's avatar
duminil committed
157
	updateGMLPolygons();
158
159
160
161
162
163
164
165
});
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
166
167
	var i = 0;
	kml_source.forEachFeature(function(feature) {
168
		try {
duminil's avatar
duminil committed
169
			var jsonIntersection = turf.intersect(poly1, feature["geoJSON"]);
170
171
			if (undefined != jsonIntersection) {
				if (!intersection_found) {
172
					dataPanel.append("Intersection found with :<br/>\n");
173
174
175
176
					intersection_found = true;
				}
				var intersection = geoJSONformat.readFeature(jsonIntersection);
				var intersectionArea = intersection.getGeometry().getArea();
duminil's avatar
duminil committed
177
				var citygml_percentage = Math.round(intersectionArea / feature["area"] * 100);
178
179
180
				var sketch_percentage = Math.round(intersectionArea / sketch_area * 100);
				intersections.addFeature(intersection);

duminil's avatar
duminil committed
181
182
				var description;
				if (feature["available"]) {
duminil's avatar
duminil committed
183
184
					description = "<a href=\"#\" onclick=\"downloadRegionFromCityGML(" + i + ");return false;\">"
							+ feature["description"] + "</a>";
duminil's avatar
duminil committed
185
				} else {
duminil's avatar
duminil committed
186
					description = feature['description'];
duminil's avatar
duminil committed
187
188
				}

189
				dataPanel.append(description + " (" + citygml_percentage + "%");
190
				if (sketch_percentage == 100) {
191
					dataPanel.append(", all inside");
192
				}
193
				dataPanel.append(")<br/>\n");
194
195
196
197
198
			}

		} catch (err) {
			console.log(feature.get('description') + " - " + err);
		}
duminil's avatar
duminil committed
199
200
		i++;
	})
201
	if (!intersection_found) {
202
		dataPanel.append("No intersection found with any CityGML<br/>\n");
203
204
	}
}
duminil's avatar
duminil committed
205
206

function downloadRegionFromCityGML(i) {
207
	// TODO: Disable all links
208
	// TODO: DRY
209
	$("html").addClass("wait");
duminil's avatar
duminil committed
210
	var feature = kml_source.getFeatures()[i];
211
212
	// Waiting 100ms in order to let the cursor change
	setTimeout(function() {
213
		// var start = new Date().getTime();
214
		fxapp.downloadRegionFromCityGML(sketchAsWKT(), feature.get("project"), feature.get("name"));
215
216
217
		// var end = new Date().getTime();
		// var time = end - start;
		// console.log('DL Execution time: ' + time);
218
219
		setTimeout(function() {
			$("html").removeClass("wait");
220
			dataPanel.append("Done<br/>\n");
221
		}, 100);
222
	}, 100);
duminil's avatar
duminil committed
223
224
}

225
function displayInfo() {
226
	// var start = new Date().getTime();
227
	dataPanel.empty();
228
229
230
231
232
	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();
233
	if (!fromJavaFX) {
234
235
236
237
238
		var gsk3_coords = "";
		var wgs84_coords = "";
		var n = coords.length;
		for (var i = 0; i < n; i++) {
			var wgs84_coord = coords[i];
239
240
			// wgs84_coords += "regionPolygon.add(new Coord(" + wgs84_coord[1] +
			// "," + wgs84_coord[0] + "));<br/>";
241
242
243
244
245
			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/>";
		}
246
247
248
249
		dataPanel.append("WGS84 Coordinates<br/>");
		dataPanel.append(wgs84_coords + "<br/>\n");
		dataPanel.append("GSK3 Coordinates<br/>");
		dataPanel.append(gsk3_coords + "<br/>\n");
250
	}
251
252
	dataPanel.append("Area" + "<br/>\n");
	dataPanel.append((Math.round(area / 1000) / 10).toString() + " ha<br/><br/>\n");
253
	findIntersections();
254
255
256
	// var end = new Date().getTime();
	// var time = end - start;
	// console.log('Execution time: ' + time);
257
258
259
260
}

draw.on('drawend', function(e) {
	displayInfo();
261
	if (fromJavaFX) {
262
		novafactory_btn.disabled = false;
263
264
	}
	draw.setActive(false);
265
266
267
});

$('#reset').click(function() {
duminil's avatar
duminil committed
268
269
270
	try {
		draw.finishDrawing();
	} finally {
271
		dataPanel.empty();
272
		$("html").removeClass("wait");
273
		draw.setActive(true);
duminil's avatar
duminil committed
274
275
276
		featureOverlay.getFeatures().clear();
		intersections.clear();
		reset_btn.disabled = true;
277
		novafactory_btn.disabled = true;
278
		focusOnMap();
duminil's avatar
duminil committed
279
	}
280
281
});

282
novafactory_btn.downloadFinished = function() {
283
	// FIXME: Weird <br>s are inserted between lines
284
285
	dataPanel.append("NovaFactory : DONE <br/>\n");
	this.disabled = false;
286
287
	// FIXME: Doesn't stop waiting cursor
	$("html").removeClass("wait");
288
289
290
}

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

novafactory_btn.selectSaveFile = function(zipFilename) {
	fxapp.doSomethingWithThisZIP(zipFilename);
296
297
298
}

$('#nfDownload').click(function() {
299
	$("html").addClass("wait");
300
	novafactory_btn.disabled = true;
301
302
303
304
	// dataPanel.append("NovaFactory BEGIN <br/>\n");
	setTimeout(function() {
		fxapp.downloadRegion(sketchAsWKT('4326'), novafactory_btn);
	}, 100);
duminil's avatar
duminil committed
305
306
});

307
308
function sketchAsWKT(epsgId) {
	var epsgId = (typeof epsgId === 'undefined') ? '31467' : epsgId;
309
	var wktFormat = new ol.format.WKT();
duminil's avatar
duminil committed
310
	return wktFormat.writeFeature(sketch, {
311
		dataProjection : ol.proj.get('EPSG:' + epsgId),
312
		featureProjection : ol.proj.get('EPSG:3857')
duminil's avatar
duminil committed
313
314
	})
}
315
316
317

function focusOnMap() {
	$('#map').focus();
duminil's avatar
duminil committed
318
	// $('#map').scrollIntoView();
319
320
}

duminil's avatar
duminil committed
321
focusOnMap();