http://blog.csdn.net/gisshixisheng/article/details/44057453

1、wkt简介

WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known-binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。WKT可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。以下为几何WKT字串样例:
POINT(6 10)
LINESTRING(3 4,10 50,20 25)
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))
MULTIPOINT(3.5 5.6, 4.8 10.5)
MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))
GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
POINT ZM (1 1 5 60)
POINT M (1 1 80)
POINT EMPTY
MULTIPOLYGON EMPTY

2、geometry

geometry为Arcgis中的几何对象,包括Extent、Multipoint、Point 、Polygon 、Polyline。

3、相互转换

实现相互转换,封装成了两个js文件,内容如下:

WKTUtil.js

  1. var WKTUtil = function(options){
  2. this.initialize(options);
  3. }
  4. WKTUtil.prototype = {
  5. /**
  6. * Constructor: OpenLayers.Format.WKT
  7. * Create a new parser for WKT
  8. *
  9. * Parameters:
  10. * options - {Object} An optional object whose properties will be set on
  11. *           this instance
  12. *
  13. * Returns:
  14. * {<OpenLayers.Format.WKT>} A new WKT parser.
  15. */
  16. initialize: function(options) {
  17. this.regExes = {
  18. 'typeStr': /^\s*(\w+)\s*\s∗(.∗)\s∗\s*$/,
  19. 'spaces': /\s+/,
  20. 'parenComma': /\)\s*,\s*\(/,
  21. 'doubleParenComma': /\)\s*\)\s*,\s*\(\s*\(/,  // can't use {2} here
  22. 'trimParens': /^\s*?(.∗?)?\s*$/
  23. };
  24. for(var i in options){
  25. this[i] = options[i];
  26. }
  27. },
  28. /**
  29. * APIMethod: read
  30. * Deserialize a WKT string and return a vector feature or an
  31. * array of vector features.  Supports WKT for POINT, MULTIPOINT,
  32. * LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON, and
  33. * GEOMETRYCOLLECTION.
  34. *
  35. * Parameters:
  36. * wkt - {String} A WKT string
  37. *
  38. * Returns:
  39. * {<OpenLayers.Feature.Vector>|Array} A feature or array of features for
  40. * GEOMETRYCOLLECTION WKT.
  41. */
  42. read: function(wkt) {
  43. var features, type, str;
  44. wkt = wkt.replace(/[\n\r]/g, " ");
  45. var matches = this.regExes.typeStr.exec(wkt);
  46. if(matches) {
  47. type = matches[1].toLowerCase();
  48. str = matches[2];
  49. if(this.parse[type]) {
  50. features = this.parse[type].apply(this, [str]);
  51. //console.log(features);
  52. }
  53. }
  54. return features;
  55. },
  56. /**
  57. * Method: extractGeometry
  58. * Entry point to construct the WKT for a single Geometry object.
  59. *
  60. * Parameters:
  61. * geometry - {<OpenLayers.Geometry.Geometry>}
  62. *
  63. * Returns:
  64. * {String} A WKT string of representing the geometry
  65. */
  66. extractGeometry: function(geometry) {
  67. var type = geometry.CLASS_NAME.split('.')[2].toLowerCase();
  68. if (!this.extract[type]) {
  69. return null;
  70. }
  71. if (this.internalProjection && this.externalProjection) {
  72. geometry = geometry.clone();
  73. geometry.transform(this.internalProjection, this.externalProjection);
  74. }
  75. var wktType = type == 'collection' ? 'GEOMETRYCOLLECTION' : type.toUpperCase();
  76. var data = wktType + '(' + this.extract[type].apply(this, [geometry]) + ')';
  77. return data;
  78. },
  79. trim: function(str){
  80. return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
  81. },
  82. /**
  83. * Object with properties corresponding to the geometry types.
  84. * Property values are functions that do the actual parsing.
  85. */
  86. parse: {
  87. /**
  88. * Return point feature given a point WKT fragment.
  89. * @param {String} str A WKT fragment representing the point
  90. * @returns {OpenLayers.Feature.Vector} A point feature
  91. * @private
  92. */
  93. 'point': function(str) {
  94. var coords = this.trim(str).split(this.regExes.spaces);
  95. return coords;//new esri.geometry.Point(coords[0], coords[1]);
  96. },
  97. /**
  98. * Return a multipoint feature given a multipoint WKT fragment.
  99. * @param {String} str A WKT fragment representing the multipoint
  100. * @returns {OpenLayers.Feature.Vector} A multipoint feature
  101. * @private
  102. */
  103. 'multipoint': function(str) {
  104. var point;
  105. var points = this.trim(str).split(',');
  106. var components = [];
  107. for(var i=0, len=points.length; i<len; ++i) {
  108. point = points[i].replace(this.regExes.trimParens, '$1');
  109. components.push(this.parse.point.apply(this, [point]).geometry);
  110. }
  111. return new OpenLayers.Feature.Vector(
  112. new OpenLayers.Geometry.MultiPoint(components)
  113. );
  114. },
  115. /**
  116. * Return a linestring feature given a linestring WKT fragment.
  117. * @param {String} str A WKT fragment representing the linestring
  118. * @returns {OpenLayers.Feature.Vector} A linestring feature
  119. * @private
  120. */
  121. 'linestring': function(str) {
  122. var points = this.trim(str).split(',');
  123. var components = [];
  124. for(var i=0, len=points.length; i<len; ++i) {
  125. components.push(this.parse.point.apply(this, [points[i]]));
  126. }
  127. return components//new esri.geometry.Polyline(components);
  128. },
  129. /**
  130. * Return a multilinestring feature given a multilinestring WKT fragment.
  131. * @param {String} str A WKT fragment representing the multilinestring
  132. * @returns {OpenLayers.Feature.Vector} A multilinestring feature
  133. * @private
  134. */
  135. 'multilinestring': function(str) {
  136. var line;
  137. var lines = OpenLayers.String.trim(str).split(this.regExes.parenComma);
  138. var components = [];
  139. for(var i=0, len=lines.length; i<len; ++i) {
  140. line = lines[i].replace(this.regExes.trimParens, '$1');
  141. components.push(this.parse.linestring.apply(this, [line]).geometry);
  142. }
  143. return new OpenLayers.Feature.Vector(
  144. new OpenLayers.Geometry.MultiLineString(components)
  145. );
  146. },
  147. /**
  148. * Return a polygon feature given a polygon WKT fragment.
  149. * @param {String} str A WKT fragment representing the polygon
  150. * @returns {OpenLayers.Feature.Vector} A polygon feature
  151. * @private
  152. */
  153. 'polygon': function(str) {
  154. var ring, linestring, linearring;
  155. var rings = this.trim(str).split(this.regExes.parenComma);
  156. var components = [];
  157. for(var i=0, len=rings.length; i<len; ++i) {
  158. ring = rings[i].replace(this.regExes.trimParens, '$1');
  159. linestring = this.parse.linestring.apply(this, [ring]);
  160. components.push(linestring);
  161. }
  162. return components;
  163. }
  164. }
  165. }

mapTran.js

  1. /**
  2. *wkt转化成arcgis的Point对象
  3. * @param wkt
  4. * @returns {Polyline}
  5. * @constructor
  6. */
  7. function WktToPoint(wkt,spatialreference){
  8. var wktUtil = new WKTUtil();
  9. var pt = wktUtil.read(wkt);
  10. var json = {
  11. x:pt[0],
  12. y:pt[1],
  13. spatialReference: spatialreference
  14. }
  15. var point = new esri.geometry.Point(json);
  16. return point;
  17. }
  18. /**
  19. *wkt转化成arcgis的Polyline对象
  20. * @param wkt
  21. * @returns {Polyline}
  22. * @constructor
  23. */
  24. function WktToPolyline(wkt, spatialreference){
  25. var wktUtil = new WKTUtil();
  26. var points = wktUtil.read(wkt);
  27. var json = {
  28. paths: [points],
  29. spatialReference: spatialreference
  30. }
  31. var polyline = new esri.geometry.Polyline(json);
  32. return polyline;
  33. }
  34. /**
  35. * wkt转化成arcgis的Polygon对象
  36. * @param wkt
  37. * @returns {Polygon}
  38. * @constructor
  39. */
  40. function WktToPolygon(wkt, spatialreference){
  41. var wktUtil = new WKTUtil();
  42. var points = wktUtil.read(wkt);
  43. var json = {
  44. rings: points,
  45. spatialReference: {"wkid":4326}
  46. }
  47. var polygon = new esri.geometry.Polygon(json);
  48. return polygon;
  49. }
  50. /**
  51. * @param geometry
  52. */
  53. function PointToWKT(geometry){
  54. console.log(geometry);
  55. return "POINT ("+geometry.x+" "+geometry.y+")";
  56. }
  57. /**
  58. * @param geometry
  59. */
  60. function PolygonToWKT(geometry){
  61. var wkt = [];
  62. var rings = geometry.rings;
  63. for(var i in rings){
  64. var ring = rings[i];
  65. for(var j in ring){
  66. var p = ring[j];
  67. wkt.push(p.join(" "));
  68. }
  69. }
  70. return "POLYGON (("+wkt.join(",")+"))";
  71. }
  72. /**
  73. * @param geometry
  74. */
  75. function LineToWKT(geometry){
  76. var wkt = [];
  77. var paths = geometry.paths;
  78. for(var i in paths){
  79. var path = paths[i];
  80. for(var j in path){
  81. var p = path[j];
  82. wkt.push(p.join(" "));
  83. }
  84. }
  85. return "LINESTRING ("+wkt.join(",")+")";
  86. }

使用的时候,直接调用对应的函数即可。

(转) Arcgis for js之WKT和GEOMETRY的相互转换的更多相关文章

  1. (转) 基于Arcgis for Js的web GIS数据在线采集简介

    http://blog.csdn.net/gisshixisheng/article/details/44310765 在前一篇博文“Arcgis for js之WKT和geometry转换”中实现了 ...

  2. (转)Arcgis for JS之对象捕捉

    http://blog.csdn.net/gisshixisheng/article/details/44098615 在web操作,如绘制或者测量的时候,为了精确,需要捕捉到某一图层的对象,在此,讲 ...

  3. Arcgis for JS之Cluster聚类分析的实现(基于区域范围的)

    原文:Arcgis for JS之Cluster聚类分析的实现(基于区域范围的) 咱们书接上文,在上文,实现了基于距离的空间聚类的算法实现,在本文,将继续介绍空间聚类之基于区域范围的实现方式,好了,闲 ...

  4. Arcgis for JS之Cluster聚类分析的实现

    原文:Arcgis for JS之Cluster聚类分析的实现 在做项目的时候,碰见了这样一个问题:给地图上标注点对象,数据是从数据库来 的,包含XY坐标信息的,通过graphic和graphicla ...

  5. Arcgis for js载入天地图

    综述:本节讲述的是用Arcgis for js载入天地图的切片资源. 天地图的切片地图能够通过esri.layers.TiledMapServiceLayer来载入.在此将之进行了一定的封装,例如以下 ...

  6. arcgis for js开发之路径分析

    arcgis for js开发之路径分析 //方法封装 function routeplan(x1, x2, y1, y2, barrierPathArray, isDraw, callback) { ...

  7. Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  8. arcgis for js学习之Draw类

    arcgis for js学习之Draw类 <!DOCTYPE html> <html> <head> <meta http-equiv="Cont ...

  9. arcgis for js学习之Graphic类

    arcgis for js学习之Graphic类 <title>Graphic类</title> <meta charset="utf-8" /> ...

随机推荐

  1. Nginx 重写规则指南1

    作者:运维生存时间 - 默北 链接:www.ttlsa.com/nginx/nginx-rewriting-rules-guide/ 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你 ...

  2. eventlet

    项目中要模拟openstack的swift的多路write功能.初步设想是用python的eventlet来实现多线程.比如在write的时候要同时写入两个storage,就用eventlet生成2个 ...

  3. 【python】字符遍历

    Python为我们提供了很多便捷的方式去遍历一个字符串中的字符.比如,将一个字符串转换为一个字符数组(列表): theList = list(theString) 同时,我们可以方便的通过for语句进 ...

  4. 自然语言处理中的Attention Model:是什么及为什么

    /* 版权声明:能够随意转载.转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 要是关注深度学习在自然语言处理方面的研究进展,我相信你一定听说过Attention Model(后文有 ...

  5. java及前端请求跨域问题

    主要代码:<meta http-equiv="Access-Control-Allow-Origin" content="*"> 说明一下什么情况下 ...

  6. Linux下的应用程序开机自启动

    Linux下的应用程序开机自启动,目前我知道的有2种: 1.将启动语句写到/etc/rc.local 2.在init.d放置启动脚本 第一种,很简单,直接写进去就行,比如说: /db/mongodb/ ...

  7. mySql学习笔记:比sql server书写要简单

    在学mySql.总的感觉,mySql与Sql Server差不多,语法都很象,但mySql也许是吸取了SQL SERVER的一些经验,SQL语句书写起来更加简单. 比如说,设置主键.索引,SQL SE ...

  8. P4700 算

    P4700 算 时间: 1000ms / 空间: 125829120KiB / Java类名: Main 背景 zhx和他的妹子出去玩. 描述

  9. [Python] partial改变方法默认參数

    Python 标准库中 functools库中有非常多对方法非常有有操作的封装,partial Objects就是当中之中的一个,他是对方法參数默认值的改动. 以下就看下简单的应用測试. #!/usr ...

  10. CodeForces - 557D Vitaly and Cycle(二分图)

    Vitaly and Cycle time limit per test 1 second memory limit per test 256 megabytes input standard inp ...