2017-02-14 9 views
0

私は線と円の地図を描くことができ、距離を計算できるopenlayer2の例があります。次にポリゴンを追加して距離を計算したいと思います。私は新しい午前ように、私はそんなにエラー.Originalコードを取得していますここOpenlayer2でポリゴンを追加して距離を計算したい

https://bitbucket.org/geographika/openlayers/overview

で誰かが助けてくださいことはできますか?

/* 
 
* APIMethod: createGeodesicPolygon 
 
* Create a regular polygon around a radius. Useful for creating circles 
 
* and the like. 
 
* 
 
* Parameters: 
 
* origin - {<OpenLayers.Geometry.Point>} center of polygon. 
 
* radius - {Float} distance to vertex, in map units. 
 
* sides - {Integer} Number of sides. 20 approximates a circle. 
 
* rotation - {Float} original angle of rotation, in degrees. 
 
* projection - {<OpenLayers.Projection>} the map's projection 
 
*/ 
 
OpenLayers.Geometry.Polygon.createGeodesicPolygon = function(origin, radius, sides, rotation, projection){ 
 

 
    if (projection.getCode() !== "EPSG:4326") { 
 
     origin.transform(projection, new OpenLayers.Projection("EPSG:4326")); 
 
    } 
 
    var latlon = new OpenLayers.LonLat(origin.x, origin.y); 
 
    
 
    var angle; 
 
    var new_lonlat, geom_point; 
 
    var points = []; 
 
    
 
    for (var i = 0; i < sides; i++) { 
 
     angle = (i * 360/sides) + rotation; 
 
     new_lonlat = OpenLayers.Util.destinationVincenty(latlon, angle, radius); 
 
     new_lonlat.transform(new OpenLayers.Projection("EPSG:4326"), projection); 
 
     geom_point = new OpenLayers.Geometry.Point(new_lonlat.lon, new_lonlat.lat); 
 
     points.push(geom_point); 
 
    } 
 
    var ring = new OpenLayers.Geometry.LinearRing(points); 
 
    return new OpenLayers.Geometry.Polygon([ring]); 
 
}; 
 

 
function handleMeasurements(event){ 
 
    var geometry = event.geometry, units = event.units, order = event.order; 
 
    var measure = event.measure, out = "", winname = 'measWin'; 
 
    var win = Ext.WindowMgr.get(winname); 
 
    
 
    if (order == 1) { 
 
     out += "Line Length: " + measure.toFixed(2) + " " + units; 
 
    } 
 
    else { 
 
     out += "Shape Area: " + measure.toFixed(2) + " " + units + "<sup>2</" + "sup>"; 
 
    } 
 
    
 
    if (!win) { 
 
     win = new Ext.Window({ 
 
      id: winname, 
 
      autoHeight: true, 
 
      width: 200, 
 
      resizable: true, 
 
      title: 'Measure Tool', 
 
      items: [{ 
 
       xtype: 'panel', 
 
       html: out, 
 
       bodyStyle: 'padding:5px;font-size:11px;background-color:#ffffff;' 
 
      }] 
 
     }); 
 
     
 
     //get the map DIV id 
 
     win.show(); 
 
     var mapId = event.object.map.div.id; 
 
     win.alignTo(Ext.getDom(mapId), 'bl-bl', [6, -80]); 
 
    } 
 
    else { 
 
     win.items.items[0].body.update(out); 
 
     if (!win.visible) { 
 
      win.show(); 
 
     } 
 
    } 
 
} 
 

 
function showWin(map, vectorLayer){ 
 

 
    var winname = "radii"; 
 
    var win = new Ext.Window({ 
 
     id: winname, 
 
     //height: 200, 
 
     width: 200, 
 
     constrain: true, 
 
     collapsible: true, 
 
     layout: 'fit', 
 
     title: 'Circle Options', 
 
     items: [{ 
 
      xtype: 'combo', 
 
      allowBlank: false, 
 
      name: 'Radius', 
 
      forceSelection: true, //limit vals to list 
 
      editable: false, //prevent text being entered 
 
      fieldLabel: 'Radius', 
 
      emptyText: 'Select a Radius...', 
 
      store: new Ext.data.SimpleStore({ 
 
       fields: ['radius', 'value'], 
 
       data: [["5 km", "5000"], ["10 km", "10000"], ["20 km", "20000"], ["50 km", "50000"], ["100 km", "100000"], ["200 km", "200000"]] 
 
      }), 
 
      displayField: 'radius', 
 
      valueField: 'value', 
 
      selectOnFocus: true, 
 
      mode: 'local', 
 
      triggerAction: 'all', 
 
      listeners: { 
 
       select: function(combo, record, index){ 
 
        var radius = record.data.value; 
 
        var feature = vectorLayer.features[vectorLayer.features.length - 1]; 
 
        if (feature) { 
 
         var centroid = feature.geometry.getCentroid(); 
 
         var projection = map.getProjectionObject(); 
 
         
 
         var sides = 40; 
 
         var new_geom = OpenLayers.Geometry.Polygon.createGeodesicPolygon(centroid, radius, sides, 45, projection); 
 
         
 
         var new_feature = new OpenLayers.Feature.Vector(new_geom); 
 
         vectorLayer.addFeatures([new_feature]); 
 
        } 
 
       } 
 
      } 
 
     }] 
 
    }); 
 
    win.show(); 
 
    var mapId = map.div.id; 
 
    win.alignTo(Ext.getDom(mapId), 'tr-tr', [-150, 6]); 
 
} 
 

 
function startApp(){ 
 
    var map = new OpenLayers.Map('map'); 
 
    var vectorLayer = new OpenLayers.Layer.Vector(); 
 
    
 
    map.addLayer(vectorLayer); 
 
    
 
    var osmLayer = new OpenLayers.Layer.OSM("OpenStreetMap", "http://tile.openstreetmap.org/${z}/${x}/${y}.png", { 
 
     'sphericalMercator': true 
 
    }); 
 
    
 
    
 
    
 
    
 
    var pointControl = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Point, { 
 
     'displayClass': 'olControlDrawFeaturePoint', 
 
     handlerOptions: { 
 
      persist: true 
 
     } 
 
    }); 
 
    
 
    
 
    var measureControl = new OpenLayers.Control.Measure(OpenLayers.Handler.Path, { 
 
     'displayClass': 'olControlDrawFeaturePath', 
 
     persist: true, 
 
     geodesic: true, 
 
     title: 'Line Measure: draw a line to see distances on the map', 
 
     handlerOptions: { 
 
      persist: true 
 
     } 
 
    }); 
 
    
 
    measureControl.events.on({ 
 
     "measure": handleMeasurements, 
 
     "measurepartial": handleMeasurements 
 
    }); 
 
    
 
    var panelControls = [new OpenLayers.Control.Navigation(), pointControl, measureControl]; 
 
    
 
    var toolbar = new OpenLayers.Control.Panel({ 
 
     displayClass: 'olControlEditingToolbar', 
 
     defaultControl: panelControls[0] 
 
    }); 
 
    
 
    toolbar.addControls(panelControls); 
 
    map.addControl(toolbar); 
 
    map.addLayer(osmLayer); 
 
    map.setCenter(new OpenLayers.LonLat(-959997.02, 6921270.79), 9); 
 
    
 
    showWin(map, vectorLayer); 
 
} 
 

 
startApp();
<html style="width:100%; height:100%"> 
 
    <head> 
 
    \t <title>Geodesic Polygon Demo</title> 
 
\t \t <!-- by Seth Girvin, http://geographika.co.uk --> 
 
     <script type="text/javascript" src="http://proj4js.org/lib/proj4js.js"> 
 
     </script> 
 
     <script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"> 
 
     </script> 
 
     <script type="text/javascript" src="GeodesicPolygon.js"> 
 
     </script> 
 
     <script type="text/javascript" src="GeodesicTools.js"> 
 
     </script> 
 
     <script type="text/javascript" src="http://extjs.cachefly.net/ext-2.2.1/adapter/ext/ext-base.js"> 
 
     </script> 
 
     <script type="text/javascript" src="http://extjs.cachefly.net/ext-2.2.1/ext-all.js"> 
 
     </script> 
 
     <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-2.2.1/resources/css/ext-all.css" /> 
 
     <script type="text/javascript"> 
 
     </script> 
 
    </head> 
 
    <body style="width:100%; height:100%"> 
 
     <div style="width:100%; height:100%" id="map"> 
 
     </div> 
 
    </body> 
 
</html>

答えて

0

私はあなたが何を意味するか、エラー全くわからないんだけど、1つの問題はhtmlbodyの両方にheightを設定していませんでした。これはOpenLayersの一般的な問題です。 divheight: 100%;のマップを格納するため、マップを含む要素の高さが固定されていない場合は、ゼロピクセルの100%になります。固定高さを使用するか、htmlまでのすべての親要素の高さを100%にすることができます。

+1

マップをクリックするだけで円を描くことはできますか? –

関連する問題