simstadt_openlayers.js 9.08 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
26
function polygon_style(color,alpha){
	return new ol.style.Style({
27
		fill : new ol.style.Fill({
28
			color : 'rgba(255, 255, 255,'+ alpha +')'
29
30
		}),
		stroke : new ol.style.Stroke({
31
32
//			color : '#777777',
			color : color,
33
34
35
36
			width : 2,
			lineDash : [ 5, 10 ]
		}),
	})
37
}
38
39
40

var kml_layer = new ol.layer.Vector({
	source : kml_source,
41
	style : polygon_style('#777777',0.2)
42
43
44
45
46
47
48
49
50
51
52
53
54
});

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

55
var novafactory_vectors = new ol.source.Vector({
56
57
58
	features : []
});

59
60
61
novafactory_vectors.addNovaFactoryProduct = function(xmin, ymin, xmax, ymax, name, epsgId) {
	var box = new ol.geom.Polygon([[[xmin,ymin],[xmin,ymax],[xmax,ymax],[xmax,ymin],[xmin,ymin]]]);
	box.transform('EPSG:'+epsgId,'EPSG:3857');
62
	this.addFeature(new ol.Feature({
63
		geometry : box,
64
65
66
67
		name : name,
	}));
}

68
69
//novafactory_vectors.addNovaFactoryProduct(3530000,5434300,3538800,5445010,"WU");
//novafactory_vectors.addNovaFactoryProduct(3510000,5415000,3523100,5422000,"LB");
70
71
72

var novafactory_layer = new ol.layer.Vector({
	source : novafactory_vectors,
73
	style : polygon_style('#ff7700',0.1)
74
75
});

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

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

89
function updateGMLPolygons() {
duminil's avatar
duminil committed
90
91
92
	kml_source.forEachFeature(function(feature) {
		feature["geoJSON"] = geoJSONformat.writeFeatureObject(feature);
		feature["area"] = feature.getGeometry().getArea();
duminil's avatar
duminil committed
93
94
95
		var project = feature.get("project");
		var name = feature.get("name");
		feature["description"] = project + ">" + name;
duminil's avatar
duminil committed
96
97
		var citygmlHere;
		if (fromJavaFX) {
98
			citygmlHere = fxapp.checkIfCityGMLSAreAvailable(project, name);
duminil's avatar
duminil committed
99
100
101
		}
		feature["available"] = citygmlHere;
	});
duminil's avatar
duminil committed
102
}
duminil's avatar
duminil committed
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
151
152
// 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;
153
154
var fromJavaFX;

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

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

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

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

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

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

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

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

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

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

novafactory_btn.selectSaveFile = function(zipFilename) {
	fxapp.doSomethingWithThisZIP(zipFilename);
298
299
300
}

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

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

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

duminil's avatar
duminil committed
323
focusOnMap();