小马看GIS–OpenLayers(三)–目测功能

群中,有位山上的朋友,问OpenLayers怎么实现目测。在我的印象中,OpenLayers不涉及空间计算的功能,结果查了查文档,发现OpenLayers中还是实现了目测功能的。先贴副图片看看效果:

 

这个例子可以计算两条直线的距离,可以计算多边形的面积。

下面把代码贴出来。

 

 

<SCRIPT src="../openlayers/OpenLayers.js"></SCRIPT>
<SCRIPT src="../openlayers/measure.js"></SCRIPT>  
<SCRIPT type=text/javascript>  
    var map, measureControls;  
    //OpenLayers.Util.onImageLoadErrorColor = "transparent";  
    function init(){  
        map = new OpenLayers.Map('map');  
        var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS",   
            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'});   
        map.addLayers([wmsLayer]);  
        map.addControl(new OpenLayers.Control.LayerSwitcher());  
        map.addControl(new OpenLayers.Control.MousePosition());  
        var options = {  
            displayUnits: 'km',  
            handlerOptions: {persist: true}  
        };  
        var circleOptions = {  
            displayUnits: 'km',  
            handlerOptions: {sides: 35,persist: true}  
        }; 
        measureControls = {  
            line: new OpenLayers.Control.Measure(OpenLayers.Handler.Path, options), 
            polygon: new OpenLayers.Control.Measure(OpenLayers.Handler.Polygon, options),
            circle: new OpenLayers.Control.Measure(OpenLayers.Handler.RegularPolygon, circleOptions)
        }; 
        var control;  
        for(var key in measureControls) {  
            control = measureControls[key];  
            control.onMeasure = handleMeasurements;  
            map.addControl(control);  
        }  
          
        map.setCenter(new OpenLayers.LonLat(0, 0), 3);  
          
        document.getElementById('noneToggle').checked = true;  
    }  
      
    function handleMeasurements(geometry, length, area, units) {  
        var element = document.getElementById('output');  
        var out = "";  
        if(geometry.CLASS_NAME == "OpenLayers.Geometry.LineString") {  
            out += "length: " + length.toFixed(3) + " " + units;  
        } else {  
            out += "perimeter: " + length.toFixed(3) + " " + units + "<br />";  
            out += "area: " + area.toFixed(3) + " " + units + "<sup>2</" + "sup>";  
        }  
        element.innerHTML = out;  
    }  

    function toggleControl(element) {  
        for(key in measureControls) {  
            var control = measureControls[key];  
            if(element.value == key && element.checked) {  
                control.activate();  
            } else {  
                control.deactivate();  
            }  
        }  
    }  
</SCRIPT>
看到这句话<script src="../openlayers/measure.js"></script>了吗?OpenLayers版本不同,可能没有这个measure.js。
现在把这个js贴出来,拷贝到您的网站中,这个功能就能实现了。
 
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD  
 * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the  
 * full text of the license. */  
  
/**  
 * @requires OpenLayers/Control.js  
 * @requires OpenLayers/Feature/Vector.js  
 */  
  
 /**  
  * Class: OpenLayers.Control.Measure  
  * Allows for drawing of features for measurements.  
  *  
  * Inherits from:  
  *  - <OpenLayers.Control>  
  */  
 OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {  
   
     /**  
      * APIProperty: handlerOptions  
      * {Object} Used to set non-default properties on the control's handler  
      */  
     handlerOptions: null,  
       
     /**  
      * APIProperty: onMeasure  
      * {Function} After a geometry is drawn, onMeasure is called with three  
      *     arguments: the geometry, its length, and its area.  
      */  
     onMeasure: function() {},  
       
     /**  
      * Property: callbacks  
      * {Object} The functions that are sent to the handler for callback  
      */  
     callbacks: null,  
       
     /**  
      * Property: displayUnits  
      * {String} Units for output.  Must be one of 'in', 'ft', 'mi', 'm', 'km',  
      *     or 'dd'.  If null, displayUnits will be assumed to be the same as  
      *     map units.  
      */  
     displayUnits: null,  
   
     /**  
      * Constructor: OpenLayers.Control.Measure  
      *   
      * Parameters:  
      * handler - {<OpenLayers.Handler>}   
      * options - {Object}   
      */  
     initialize: function(handler, options) {  
         OpenLayers.Control.prototype.initialize.apply(this, [options]);  
         this.callbacks = OpenLayers.Util.extend(  
             {done: this.measureGeometry, point: this.partialMeasure},  
             this.callbacks  
         );  
         this.handler = new handler(this, this.callbacks, this.handlerOptions);  
     },  
   
     /**  
      * Method: measureGeometry  
      */  
     measureGeometry: function(geometry) {  
         var area = this.getArea(geometry);  
         var length = this.getLength(geometry);  
         this.onMeasure(geometry, length, area, this.displayUnits);  
     },  
       
     /**  
      * Method: getArea  
      */  
     getArea: function(geometry) {  
         var area = geometry.getArea();  
         var inPerDisplayUnit = OpenLayers.INCHES_PER_UNIT[this.displayUnits];  
         if(inPerDisplayUnit) {  
             var inPerMapUnit = OpenLayers.INCHES_PER_UNIT[this.map.units];  
             area *= Math.pow((inPerMapUnit / inPerDisplayUnit), 2);  
         }  
         return area;  
     },  
       
     /**  
      * Method: getLength  
      */  
     getLength: function(geometry) {  
         var length = geometry.getLength();  
         var inPerDisplayUnit = OpenLayers.INCHES_PER_UNIT[this.displayUnits];  
         if(inPerDisplayUnit) {  
             var inPerMapUnit = OpenLayers.INCHES_PER_UNIT[this.map.units];  
             length *= (inPerMapUnit / inPerDisplayUnit);  
         }  
         return length;  
     },  
   
     CLASS_NAME: "OpenLayers.Control.Measure"  
 }); 

转载自:https://blog.csdn.net/mach365/article/details/2738608

You may also like...

退出移动版