Skip to content

Commit 275d1be

Browse files
committed
Merge pull request #3124 from AnalyticalGraphicsInc/kml-stinks
Be more lenient when processing KML coordinates
2 parents 6552144 + a772110 commit 275d1be

File tree

3 files changed

+74
-37
lines changed

3 files changed

+74
-37
lines changed

Source/DataSources/KmlDataSource.js

+18-19
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ define([
99
'../Core/createGuid',
1010
'../Core/defaultValue',
1111
'../Core/defined',
12+
'../Core/definedNotNull',
1213
'../Core/defineProperties',
1314
'../Core/DeveloperError',
1415
'../Core/Ellipsoid',
@@ -60,6 +61,7 @@ define([
6061
createGuid,
6162
defaultValue,
6263
defined,
64+
definedNotNull,
6365
defineProperties,
6466
DeveloperError,
6567
Ellipsoid,
@@ -276,14 +278,14 @@ define([
276278
}
277279

278280
function readCoordinate(value) {
281+
//Google Earth treats empty or missing coordinates as 0.
279282
if (!defined(value)) {
280-
return undefined;
283+
return Cartesian3.fromDegrees(0, 0, 0);
281284
}
282285

283286
var digits = value.match(/[^\s,\n]+/g);
284-
if (digits.length !== 2 && digits.length !== 3) {
285-
window.console.log('KML - Invalid coordinates: ' + value);
286-
return undefined;
287+
if (!definedNotNull(digits)) {
288+
return Cartesian3.fromDegrees(0, 0, 0);
287289
}
288290

289291
var longitude = parseFloat(digits[0]);
@@ -303,6 +305,10 @@ define([
303305
}
304306

305307
var tuples = element.textContent.match(/[^\s\n]+/g);
308+
if (!definedNotNull(tuples)) {
309+
return undefined;
310+
}
311+
306312
var length = tuples.length;
307313
var result = new Array(length);
308314
var resultIndex = 0;
@@ -438,12 +444,13 @@ define([
438444
}
439445

440446
var colorOptions = {};
447+
441448
function parseColorString(value, isRandom) {
442449
if (!defined(value)) {
443450
return undefined;
444451
}
445452

446-
if(value[0] === '#'){
453+
if (value[0] === '#') {
447454
value = value.substring(1);
448455
}
449456

@@ -843,7 +850,7 @@ define([
843850
}
844851

845852
if ((defined(altitudeMode) && altitudeMode !== 'clampToGround') || //
846-
(defined(gxAltitudeMode) && gxAltitudeMode !== 'clampToSeaFloor')) {
853+
(defined(gxAltitudeMode) && gxAltitudeMode !== 'clampToSeaFloor')) {
847854
window.console.log('KML - Unknown altitudeMode: ' + defaultValue(altitudeMode, gxAltitudeMode));
848855
}
849856

@@ -927,9 +934,6 @@ define([
927934
var extrude = queryBooleanValue(geometryNode, 'extrude', namespaces.kml);
928935

929936
var position = readCoordinate(coordinatesString);
930-
if (!defined(position)) {
931-
return;
932-
}
933937

934938
entity.position = createPositionPropertyFromAltitudeMode(new ConstantPositionProperty(position), altitudeMode, gxAltitudeMode);
935939
processPositionGraphics(dataSource, entity, styleEntity);
@@ -1028,12 +1032,9 @@ define([
10281032
var coordinates = [];
10291033
var times = [];
10301034
for (var i = 0; i < length; i++) {
1031-
//An empty position is OK according to the spec
10321035
var position = readCoordinate(coordNodes[i].textContent);
1033-
if (defined(position)) {
1034-
coordinates.push(position);
1035-
times.push(JulianDate.fromIso8601(timeNodes[i].textContent));
1036-
}
1036+
coordinates.push(position);
1037+
times.push(JulianDate.fromIso8601(timeNodes[i].textContent));
10371038
}
10381039
var property = new SampledPositionProperty();
10391040
property.addSamples(times, coordinates);
@@ -1114,12 +1115,9 @@ define([
11141115
var positions = [];
11151116
times = [];
11161117
for (var x = 0; x < length; x++) {
1117-
//An empty position is OK according to the spec
11181118
var position = readCoordinate(coordNodes[x].textContent);
1119-
if (defined(position)) {
1120-
positions.push(position);
1121-
times.push(JulianDate.fromIso8601(timeNodes[x].textContent));
1122-
}
1119+
positions.push(position);
1120+
times.push(JulianDate.fromIso8601(timeNodes[x].textContent));
11231121
}
11241122

11251123
if (interpolate) {
@@ -1191,6 +1189,7 @@ define([
11911189
}
11921190

11931191
var scratchDiv = document.createElement('div');
1192+
11941193
function processDescription(node, entity, styleEntity, uriResolver) {
11951194
var i;
11961195
var key;

Specs/DataSources/KmlDataSourceSpec.js

+53-17
Original file line numberDiff line numberDiff line change
@@ -1704,21 +1704,21 @@ defineSuite([
17041704
expect(label.eyeOffset).toBeUndefined();
17051705
expect(label.pixelOffsetScaleByDistance).toBeUndefined();
17061706

1707-
expect(label.text).toBeUndefined();
1708-
expect(label.fillColor).toBeUndefined();
1709-
expect(label.outlineColor).toBeUndefined();
1710-
expect(label.outlineWidth).toBeUndefined();
1711-
expect(label.show).toBeUndefined();
1712-
expect(label.scale).toBeUndefined();
1713-
expect(label.verticalOrigin).toBeUndefined();
1714-
expect(label.eyeOffset).toBeUndefined();
1715-
expect(label.pixelOffsetScaleByDistance).toBeUndefined();
1707+
expect(label.text).toBeUndefined();
1708+
expect(label.fillColor).toBeUndefined();
1709+
expect(label.outlineColor).toBeUndefined();
1710+
expect(label.outlineWidth).toBeUndefined();
1711+
expect(label.show).toBeUndefined();
1712+
expect(label.scale).toBeUndefined();
1713+
expect(label.verticalOrigin).toBeUndefined();
1714+
expect(label.eyeOffset).toBeUndefined();
1715+
expect(label.pixelOffsetScaleByDistance).toBeUndefined();
17161716

1717-
expect(label.font.getValue()).toEqual('16px sans-serif');
1718-
expect(label.style.getValue()).toEqual(LabelStyle.FILL_AND_OUTLINE);
1719-
expect(label.horizontalOrigin.getValue()).toEqual(HorizontalOrigin.LEFT);
1720-
expect(label.pixelOffset.getValue()).toEqual(new Cartesian2(17, 0));
1721-
expect(label.translucencyByDistance.getValue()).toEqual(new NearFarScalar(3000000, 1.0, 5000000, 0.0));
1717+
expect(label.font.getValue()).toEqual('16px sans-serif');
1718+
expect(label.style.getValue()).toEqual(LabelStyle.FILL_AND_OUTLINE);
1719+
expect(label.horizontalOrigin.getValue()).toEqual(HorizontalOrigin.LEFT);
1720+
expect(label.pixelOffset.getValue()).toEqual(new Cartesian2(17, 0));
1721+
expect(label.translucencyByDistance.getValue()).toEqual(new NearFarScalar(3000000, 1.0, 5000000, 0.0));
17221722
});
17231723
});
17241724

@@ -1961,7 +1961,7 @@ defineSuite([
19611961
return KmlDataSource.load(parser.parseFromString(kml, "text/xml")).then(function(dataSource) {
19621962
var entities = dataSource.entities.values;
19631963
expect(entities.length).toEqual(1);
1964-
expect(entities[0].position).toBeUndefined();
1964+
expect(entities[0].position.getValue(Iso8601.MINIMUM_VALUE)).toEqual(Cartesian3.fromDegrees(0, 0, 0));
19651965
expect(entities[0].polyline).toBeUndefined();
19661966
});
19671967
});
@@ -1970,14 +1970,31 @@ defineSuite([
19701970
var kml = '<?xml version="1.0" encoding="UTF-8"?>\
19711971
<Placemark>\
19721972
<Point>\
1973+
<altitudeMode>absolute</altitudeMode>\
19731974
<coordinates>1,2,3,4</coordinates>\
19741975
</Point>\
19751976
</Placemark>';
19761977

19771978
return KmlDataSource.load(parser.parseFromString(kml, "text/xml")).then(function(dataSource) {
19781979
var entities = dataSource.entities.values;
19791980
expect(entities.length).toEqual(1);
1980-
expect(entities[0].position).toBeUndefined();
1981+
expect(entities[0].position.getValue(Iso8601.MINIMUM_VALUE)).toEqual(Cartesian3.fromDegrees(1, 2, 3));
1982+
expect(entities[0].polyline).toBeUndefined();
1983+
});
1984+
});
1985+
1986+
it('Geometry Point: handles empty coordinates', function() {
1987+
var kml = '<?xml version="1.0" encoding="UTF-8"?>\
1988+
<Placemark>\
1989+
<Point>\
1990+
<coordinates></coordinates>\
1991+
</Point>\
1992+
</Placemark>';
1993+
1994+
return KmlDataSource.load(parser.parseFromString(kml, "text/xml")).then(function(dataSource) {
1995+
var entities = dataSource.entities.values;
1996+
expect(entities.length).toEqual(1);
1997+
expect(entities[0].position.getValue(Iso8601.MINIMUM_VALUE)).toEqual(Cartesian3.fromDegrees(0, 0, 0));
19811998
expect(entities[0].polyline).toBeUndefined();
19821999
});
19832000
});
@@ -2133,6 +2150,25 @@ defineSuite([
21332150
});
21342151
});
21352152

2153+
it('Geometry Polygon: handles empty coordinates', function() {
2154+
var kml = '<?xml version="1.0" encoding="UTF-8"?>\
2155+
<Placemark>\
2156+
<Polygon>\
2157+
<outerBoundaryIs>\
2158+
<LinearRing>\
2159+
<coordinates>\
2160+
</coordinates>\
2161+
</LinearRing>\
2162+
</outerBoundaryIs>\
2163+
</Polygon>\
2164+
</Placemark>';
2165+
2166+
return KmlDataSource.load(parser.parseFromString(kml, "text/xml")).then(function(dataSource) {
2167+
var entity = dataSource.entities.values[0];
2168+
expect(entity.polygon.hierarchy).toBeUndefined();
2169+
});
2170+
});
2171+
21362172
it('Geometry Polygon: without holes', function() {
21372173
var kml = '<?xml version="1.0" encoding="UTF-8"?>\
21382174
<Placemark>\
@@ -2851,4 +2887,4 @@ defineSuite([
28512887
expect(entity.label.text.getValue()).toBe('bob');
28522888
});
28532889
});
2854-
});
2890+
});

Specs/Widgets/Viewer/ViewerSpec.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*global defineSuite*/
22
defineSuite([
3+
'Widgets/Viewer/Viewer',
34
'Core/Cartesian3',
45
'Core/ClockRange',
56
'Core/ClockStep',
@@ -33,6 +34,7 @@ defineSuite([
3334
'Widgets/SelectionIndicator/SelectionIndicator',
3435
'Widgets/Timeline/Timeline'
3536
], function(
37+
Viewer,
3638
Cartesian3,
3739
ClockRange,
3840
ClockStep,
@@ -938,4 +940,4 @@ defineSuite([
938940
expect(preMixinDataSource.entities.collectionChanged._listeners.length).not.toEqual(preMixinListenerCount);
939941
expect(postMixinDataSource.entities.collectionChanged._listeners.length).not.toEqual(postMixinListenerCount);
940942
});
941-
}, 'WebGL');
943+
}, 'WebGL');

0 commit comments

Comments
 (0)