saveKml.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. var ModelCache = {};
  2. function createModelNode(SuperMap3D,entity){
  3. var model = entity.model;
  4. var modelNode;
  5. if(model){
  6. var position = entity.position;
  7. var locationNode;
  8. if(position instanceof SuperMap3D.SampledPositionProperty){
  9. var data = position._property;
  10. var times = [];
  11. var values = data._values;
  12. var points = [];
  13. var len = data._times.length;
  14. var j = 0;
  15. var i = 0;
  16. while(j < len){
  17. points.push(new SuperMap3D.Cartesian3(values[i],values[i+1],values[i+2]));
  18. var time = data._times[j];
  19. times[j] = SuperMap3D.JulianDate.toIso8601(time);
  20. j++;
  21. i = i + 3;
  22. }
  23. var trackNodes = [];
  24. for(var i = 0,j = times.length;i < j;i++){
  25. var coord = SuperMap3D.Cartographic.fromCartesian(points[i]);
  26. var lon = SuperMap3D.Math.toDegrees(coord.longitude);
  27. var lat = SuperMap3D.Math.toDegrees(coord.latitude);
  28. var height = coord.height
  29. var coordStr = lon + ' ' + lat + ' ' + height;
  30. var coordNode = createNode('gx:coord',coordStr);
  31. var whenNode = createNode('when',times[i]);
  32. trackNodes.push(whenNode);
  33. trackNodes.push(coordNode);
  34. }
  35. var trackNode = addNodes('gx:Track',trackNodes);
  36. var altitudeModeNode = createNode('altitudeMode','absolute');
  37. var interpolateNode = createNode('gx:interpolate','1');
  38. var multiTrackNode = addNodes('gx:MultiTrack',[altitudeModeNode,interpolateNode,trackNode]);
  39. var styleUrlNode = createNode('styleUrl','#' + entity.id);
  40. var descriptionNode = createNode('description','<![CDATA[BIKE RIDE]]>');
  41. var nameNode = createNode('name','<![CDATA[bcj]]>');
  42. locationNode = addNode('Location',multiTrackNode);
  43. }
  44. else{
  45. var longitudeNode = createNode('longitude',0);
  46. var latitudeNode = createNode('latitude',0);
  47. var altitudeNode = createNode('altitude',0);
  48. locationNode = addNodes('Location',[longitudeNode,latitudeNode,altitudeNode]);
  49. }
  50. var docUri = new SuperMap3D.Uri(document.location.href);
  51. var modelUri = new SuperMap3D.Uri(model._uri._value);
  52. var baseUri = modelUri.resolve(docUri).toString();
  53. var hrefNode = createNode('href',baseUri);
  54. var linkNode = addNode('Link',hrefNode);
  55. var xScaleNode = createNode('x',1);
  56. var yScaleNode = createNode('y',1);
  57. var zScaleNode = createNode('z',1);
  58. var scaleNode = addNodes('Scale',[xScaleNode,yScaleNode,zScaleNode]);
  59. var headingNode = createNode('heading',270);
  60. var tiltNode = createNode('tilt',0);
  61. var rollNode = createNode('roll',0);
  62. var orientationNode = addNodes('Orientation',[headingNode,tiltNode,rollNode]);
  63. var altitudeModeNode = createNode('altitudeMode','relativeToGround');
  64. modelNode = addNodes('Model',[locationNode,orientationNode,scaleNode,linkNode]);
  65. }
  66. return modelNode;
  67. }
  68. function createStyleNode(entity){
  69. var billboard = entity.billboard;
  70. var styleNode;
  71. if(billboard){
  72. var img = billboard.image;
  73. var hrefNode;
  74. if(img){
  75. var href = img._value;
  76. var hrefNode = createNode('href',href);
  77. var iconNode = addNode('Icon',hrefNode);
  78. var scaleNode;
  79. if(billboard.scale){
  80. var scale = billboard.scale._value;
  81. scaleNode = createNode('scale',scale);
  82. }
  83. else{
  84. scaleNode = createNode('scale',1);
  85. }
  86. var pixelOffset = billboard.pixelOffset;
  87. var hotSpotNode;
  88. if(pixelOffset){
  89. var x = pixelOffset._value.x;
  90. x = -1*(x - billboard.width*0.5*scale);
  91. var y = pixelOffset._value.y;
  92. y = y + billboard.height*0.5*scale;
  93. var obj = {
  94. x : x,
  95. y : y,
  96. xunits : 'pixels',
  97. yunits : 'pixels'
  98. };
  99. hotSpotNode = addOnlyAttrNode('hotSpot',obj);
  100. }
  101. var iconStyleNode = addNodes('IconStyle',[scaleNode,iconNode,hotSpotNode])
  102. var path = entity.path;
  103. var lineStyleNode;
  104. if(path){
  105. var color = path.material.color._value;
  106. color = 'ff0000ff';
  107. var width = path.width._value;
  108. var colorNode = createNode('color',color);
  109. var widthNode = createNode('width',width);
  110. lineStyleNode = addNodes('LineStyle',[colorNode,widthNode]);
  111. }
  112. styleNode = addNodes('Style',[iconStyleNode,lineStyleNode],{
  113. id : entity.id
  114. });
  115. }
  116. }
  117. return styleNode;
  118. }
  119. function createPlaceMark(SuperMap3D,entity,modelNode){
  120. var position = entity.position;
  121. var placeMarkNode;
  122. var descriptionValue = '';
  123. if(entity.description){
  124. descriptionValue = entity.description.getValue();
  125. }
  126. var description = '<![CDATA[{description}]]>'.replace('{description}',descriptionValue);
  127. var entityName = '<![CDATA[{name}]]>'.replace('{name}',entity.name);
  128. if(modelNode){
  129. var nameNode = createNode('name',entityName);
  130. var descriptionNode = createNode('description',description);
  131. placeMarkNode = addNodes('Placemark',[nameNode,descriptionNode,modelNode]);
  132. }
  133. else{
  134. if(position instanceof SuperMap3D.CompositePositionProperty){
  135. var intervals = position.intervals;
  136. if(intervals && intervals instanceof SuperMap3D.TimeIntervalCollection){
  137. var timeInterval = intervals._intervals[0];
  138. if(timeInterval && timeInterval instanceof SuperMap3D.TimeInterval){
  139. var data = timeInterval.data._value._property;
  140. var times = [];
  141. var values = data._values;
  142. var points = [];
  143. var len = data._times.length;
  144. var j = 0;
  145. var i = 0;
  146. while(j < len){
  147. points.push(new SuperMap3D.Cartesian3(values[i],values[i+1],values[i+2]));
  148. var time = data._times[j];
  149. times[j] = SuperMap3D.JulianDate.toIso8601(time);
  150. j++;
  151. i = i + 3;
  152. }
  153. var trackNodes = [];
  154. for(var i = 0,j = times.length;i < j;i++){
  155. var coord = SuperMap3D.Cartographic.fromCartesian(points[i]);
  156. var lon = SuperMap3D.Math.toDegrees(coord.longitude);
  157. var lat = SuperMap3D.Math.toDegrees(coord.latitude);
  158. var height = coord.height
  159. var coordStr = lon + ' ' + lat + ' ' + height;
  160. var coordNode = createNode('gx:coord',coordStr);
  161. var whenNode = createNode('when',times[i]);
  162. trackNodes.push(whenNode);
  163. trackNodes.push(coordNode);
  164. }
  165. var trackNode = addNodes('gx:Track',trackNodes);
  166. var altitudeModeNode = createNode('altitudeMode','absolute');
  167. var interpolateNode = createNode('gx:interpolate','1');
  168. var multiTrackNode = addNodes('gx:MultiTrack',[altitudeModeNode,interpolateNode,trackNode]);
  169. var styleUrlNode = createNode('styleUrl','#' + entity.id);
  170. var descriptionNode = createNode('description',description);
  171. var nameNode = createNode('name',entityName);
  172. placeMarkNode = addNodes('Placemark',[nameNode,descriptionNode,styleUrlNode,multiTrackNode],{
  173. id : entity.id
  174. });
  175. }
  176. }
  177. }
  178. else if(position instanceof SuperMap3D.SampledPositionProperty){
  179. var data = position._property;
  180. var times = [];
  181. var values = data._values;
  182. var points = [];
  183. var len = data._times.length;
  184. var j = 0;
  185. var i = 0;
  186. while(j < len){
  187. points.push(new SuperMap3D.Cartesian3(values[i],values[i+1],values[i+2]));
  188. var time = data._times[j];
  189. times[j] = SuperMap3D.JulianDate.toIso8601(time);
  190. j++;
  191. i = i + 3;
  192. }
  193. var trackNodes = [];
  194. for(var i = 0,j = times.length;i < j;i++){
  195. var coord = SuperMap3D.Cartographic.fromCartesian(points[i]);
  196. var lon = SuperMap3D.Math.toDegrees(coord.longitude);
  197. var lat = SuperMap3D.Math.toDegrees(coord.latitude);
  198. var height = coord.height
  199. var coordStr = lon + ' ' + lat + ' ' + height;
  200. var coordNode = createNode('gx:coord',coordStr);
  201. var whenNode = createNode('when',times[i]);
  202. trackNodes.push(whenNode);
  203. trackNodes.push(coordNode);
  204. }
  205. var trackNode = addNodes('gx:Track',trackNodes);
  206. var altitudeModeNode = createNode('altitudeMode','absolute');
  207. var interpolateNode = createNode('gx:interpolate','1');
  208. var multiTrackNode = addNodes('gx:MultiTrack',[altitudeModeNode,interpolateNode,trackNode]);
  209. var styleUrlNode = createNode('styleUrl','#' + entity.id);
  210. var descriptionNode = createNode('description',description);
  211. var nameNode = createNode('name',entityName);
  212. placeMarkNode = addNodes('Placemark',[nameNode,descriptionNode,styleUrlNode,multiTrackNode],{
  213. id : entity.id
  214. });
  215. }
  216. else{
  217. var point = position._value;
  218. var coord = SuperMap3D.Cartographic.fromCartesian(point);
  219. var lon = SuperMap3D.Math.toDegrees(coord.longitude);
  220. var lat = SuperMap3D.Math.toDegrees(coord.latitude);
  221. var coordStr = lon + ',' + lat + ',' + coord.height;
  222. var coordNode = createNode('coordinates',coordStr);
  223. var pointNode = addNode('Point',coordNode);
  224. var nameNode = createNode('name',entityName);
  225. var descriptionNode = createNode('description',description);
  226. var styleUrlNode = createNode('styleUrl','#' + entity.id);
  227. var altitudeModeNode = createNode('altitudeMode','absolute');
  228. placeMarkNode = addNodes('Placemark',[nameNode,descriptionNode,styleUrlNode,altitudeModeNode,pointNode]);
  229. }
  230. }
  231. return placeMarkNode;
  232. }
  233. function write(SuperMap3D,entity){
  234. var styleNode;
  235. var modelNode;
  236. var geometryNode;//暂时不支持
  237. var placeMarkNode;
  238. if(entity.billboard){
  239. styleNode = createStyleNode(entity);
  240. placeMarkNode = createPlaceMark(SuperMap3D,entity,modelNode);
  241. }
  242. else if(entity.model){
  243. modelNode = createModelNode(SuperMap3D,entity);
  244. placeMarkNode = createPlaceMark(SuperMap3D,entity,modelNode);
  245. }
  246. else{
  247. }
  248. return {
  249. placeMarkNode : placeMarkNode,
  250. styleNode : styleNode
  251. };
  252. }
  253. function createXML(content){
  254. var head = '<?xml version="1.0" encoding="UTF-8"?>';
  255. var nameSpace = '<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom">';
  256. return [
  257. head,
  258. nameSpace,
  259. content,
  260. '</kml>'
  261. ].join('\n');
  262. }
  263. function writeKml(SuperMap3D,entities){
  264. //var dataSources = viewer.dataSources._dataSources;
  265. /*for(var i = 0,j = dataSources.length;i < j;i++){
  266. var dataSource = dataSources[i];
  267. var entities = dataSource.entities.values;
  268. for(var m = 0,n = entities.length;m < n;m++){
  269. objs.push(write(entities[m]));
  270. }
  271. }*/
  272. var objs = [];
  273. for(var m = 0,n = entities.length;m < n;m++){
  274. objs.push(write(SuperMap3D,entities[m]));
  275. }
  276. var openNode = createNode('open','1');
  277. var visibilityNode = createNode('visibility','1');
  278. var nameNode = createNode('name','<![CDATA[test]]>');
  279. var nodes = [openNode,visibilityNode,nameNode];
  280. for(var i = 0,j = objs.length;i < j;i++){
  281. var obj = objs[i];
  282. nodes.push(obj['styleNode']);
  283. nodes.push(obj['placeMarkNode']);
  284. }
  285. var documentNode = addNodes('Document',nodes);
  286. var kmlNode = createXML(documentNode);
  287. return kmlNode;
  288. }
  289. function addOnlyAttrNode(nodeName,attr){
  290. var startTag = '<' + nodeName;
  291. var result = [startTag];
  292. for(var key in attr){
  293. result.push(key + '=' + '\"' + attr[key] + '\"');
  294. }
  295. result.push('/>');
  296. return result.join(' ');
  297. }
  298. function createNode(name,content){
  299. var startTag = '<' + name + '>';
  300. var endTag = '</' + name + '>';
  301. return [
  302. startTag,
  303. content,
  304. endTag
  305. ].join('');
  306. }
  307. function addNodes(parent,children,attr){
  308. var startTag = '<' + parent;
  309. for(var key in attr){
  310. startTag += (' ' + key + '=' + '\"' + attr[key] + '\"' + ' ');
  311. }
  312. startTag += '>';
  313. var endTag = '</' + parent + '>';
  314. var result = [];
  315. result.push(startTag);
  316. for(var i = 0,j = children.length;i < j;i++){
  317. var child = children[i];
  318. if(child){
  319. result.push(child);
  320. }
  321. }
  322. result.push(endTag);
  323. return result.join('\n');
  324. }
  325. function addNode(parent,child){
  326. var startTag = '<' + parent + '>';
  327. var endTag = '</' + parent + '>';
  328. return [
  329. startTag,
  330. child,
  331. endTag
  332. ].join('\n');
  333. }
  334. function saveKml(SuperMap3D,viewer){
  335. var entities = [].concat(viewer.entities.values);
  336. var dataSources = viewer.dataSources._dataSources;
  337. for(var i = 0,j = dataSources.length;i < j;i++){
  338. var dataSource = dataSources[i];
  339. var dataSourceEntities = dataSource.entities.values;
  340. for(var m = 0,n = dataSourceEntities.length;m < n;m++){
  341. entities = entities.concat(dataSourceEntities[m]);
  342. }
  343. }
  344. var kmlContent = writeKml(SuperMap3D,entities);
  345. var uri = 'data:text;charset=utf-8,' + encodeURIComponent(kmlContent);
  346. var downloadLink = document.createElement("a");
  347. downloadLink.href = uri;
  348. var fileName = "myPlaceMarker" + "_" + new Date().toLocaleDateString() + ".kml";
  349. downloadLink.download = fileName;
  350. document.body.appendChild(downloadLink);
  351. downloadLink.click();
  352. document.body.removeChild(downloadLink);
  353. }