zoukankan      html  css  js  c++  java
  • (转) Arcgis for js之WKT和GEOMETRY的相互转换

    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

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

    mapTran.js

    [javascript] view plain copy
     
     print?
    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. /**  
    74.  * @param geometry 
    75. */  
    76. function LineToWKT(geometry){  
    77.     var wkt = [];  
    78.     var paths = geometry.paths;  
    79.     for(var i in paths){  
    80.         var path = paths[i];  
    81.         for(var j in path){  
    82.             var p = path[j];  
    83.             wkt.push(p.join(" "));  
    84.         }  
    85.     }     
    86.     return "LINESTRING ("+wkt.join(",")+")";  
    87. }  

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

  • 相关阅读:
    failed to push some refs to 'git@github.com:laniu/liuna.git'报错原因
    ECMAScript和JavaScript的关系
    js面试总结
    第16章 脚本化css
    代理模式
    SQL
    VS
    Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
    SQL
    C#
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6972703.html
Copyright © 2011-2022 走看看