Skip to content

Instantly share code, notes, and snippets.

@mourner
Created December 18, 2012 11:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mourner/4327150 to your computer and use it in GitHub Desktop.
Save mourner/4327150 to your computer and use it in GitHub Desktop.
Some old KML parsing code from CloudMade Web Maps API for @tmcw
CM.GeoXML.prototype = {
// ...
_parseKmlStyle: function(obj) {
var style = {};
if (obj.LineStyle) {
if (obj.LineStyle.color) {
var color = this._parseKmlColor(obj.LineStyle.color.$);
style.color = color.rgb;
style.opacity = color.opacity;
//TODO: colorMode=random
}
style.weight = obj.LineStyle.width && parseInt(obj.LineStyle.width.$);
}
if (obj.PolyStyle) {
var noFill = obj.PolyStyle.fill && (obj.PolyStyle.fill.$ == '0');
var noStroke = obj.PolyStyle.outline && (obj.PolyStyle.outline.$ == '0');
if (noStroke) {
style.weight = 0;
style.opacity = 0;
}
if (obj.PolyStyle.color && !noFill) {
var c = this._parseKmlColor(obj.PolyStyle.color.$);
style.fillColor = c.rgb;
style.fillOpacity = c.opacity;
}
}
if (obj.IconStyle) {
style.icon = new CM.Icon();
style.icon.image = obj.IconStyle.Icon.href.$;
var w = obj.IconStyle.w ? parseInt(obj.IconStyle.w.$) : 32;
var h = obj.IconStyle.h ? parseInt(obj.IconStyle.h.$) : 32;
if (obj.IconStyle.scale) {
w = parseInt(w * parseFloat(obj.IconStyle.scale.$));
h = parseInt(h * parseFloat(obj.IconStyle.scale.$));
}
style.icon.iconSize = new CM.Size(w, h);
//TODO: hotSpot -> iconAnchor
}
this._styles['#' + obj['@id']] = style;
},
_parseKmlStyleMap: function(obj) {
if (obj.Pair && obj.Pair[0]) {
if (obj.Pair[0].Style) {
this._parseKmlStyle(obj.Pair[0].Style);
} else {
this._styleMaps['#' + obj['@id']] = obj.Pair[0].styleUrl.$;
}
}
},
_parseKmlPlacemark: function(obj) {
var placemark = {};
if (obj.Point) {
placemark.latlng = this._parseKmlCoordinates(obj.Point.coordinates.$)[0];
placemark.type = 'Marker';
} else if (obj.LineString || obj.LinearRing) {
placemark.latlngs = this._parseKmlCoordinates((obj.LineString || obj.LinearRing).coordinates.$);
placemark.type = (obj.LinearRing ? 'Polygon' : 'Polyline');
} else if (obj.Polygon) {
var outerLatlngs = this._parseKmlCoordinates(obj.Polygon.outerBoundaryIs.LinearRing.coordinates.$), coords;
if (obj.Polygon.innerBoundaryIs) {
if (obj.Polygon.innerBoundaryIs.LinearRing instanceof Array) {
var innerLatlngsArr = [];
for (var i = 0; i < obj.Polygon.innerBoundaryIs.LinearRing.length; i++) {
coords = obj.Polygon.innerBoundaryIs.LinearRing[i].coordinates.$;
innerLatlngsArr.push(this._parseKmlCoordinates(coords));
}
placemark.latlngs = [outerLatlngs].concat(innerLatlngsArr);
} else {
coords = obj.Polygon.innerBoundaryIs.LinearRing.coordinates.$;
placemark.latlngs = [outerLatlngs, this._parseKmlCoordinates(coords)];
}
} else {
placemark.latlngs = outerLatlngs;
}
placemark.type = 'Polygon';
} else if (obj.MultiGeometry) {
for (var i in obj.MultiGeometry) {
if (obj.MultiGeometry.hasOwnProperty(i)) {
if (obj.MultiGeometry[i] instanceof Array) {
for (var j = 0; j < obj.MultiGeometry[i].length; j++) {
var part = CM.Util.extend({}, obj);
part.MultiGeometry = null;
part[i] = obj.MultiGeometry[i][j];
this._parseKmlPlacemark(part);
}
} else {
var part = CM.Util.extend({}, obj);
part.MultiGeometry = null;
part[i] = obj.MultiGeometry[i];
this._parseKmlPlacemark(part);
}
}
}
return;
} else {
return;
}
placemark.name = obj.name && obj.name.$;
placemark.description = obj.description && obj.description.$;
placemark.styleUrl = obj.styleUrl && obj.styleUrl.$;
this._placemarks.push(placemark);
},
_parseKmlColor: function(c) {
return {
rgb: '#' + c.slice(6, 8) + c.slice(4, 6) + c.slice(2, 4),
opacity: parseInt(c.slice(0, 2), 16) / 255
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment