在地图上画饼图(ol3)

1、数据加载

数据格式为GeoJSON:
var f={
    "geometry": {
        "type": "Point",
        "coordinates":  ol.proj.transform([116.249084, 40.092781], 'EPSG:4326', 'EPSG:3857')
    },
    "type": "Feature",
    "properties": {
        "wt1": 20,
        "wt2": 50,
        "wt3": 30
    }
};
基于以上数据构造一个feature,然后将这个feature加载到GeoJSON数据源上
var GeoJson=new ol.format.GeoJSON();
var feature=GeoJson.readFeature(JSON.stringify(f));
var source=new ol.source.GeoJSON({
    projection: 'EPSG:3857'
});
source.addFeature(feature);

2、画饼图

var layer=new ol.layer.Vector({
    source: source,
    style:function(feature, resolution) {
            var color = ["#27255F","#2F368F","#3666B0"];
            var data = [feature.get("wt1"),feature.get("wt2"),feature.get("wt3")];
            var ctx = ol.dom.createCanvasContext2D(60,60);
            var startPoint=0;
            for(var i=0;i<data.length;i++){
                ctx.fillStyle = color[i];
                ctx.beginPath();
                ctx.moveTo(30,30);
                ctx.arc(30,30,30,startPoint,startPoint+Math.PI*2*(data[i]/100),false);
                ctx.fill();
                startPoint+=Math.PI*2*(data[i]/100);
            }
            return [new ol.style.Style({image:new ol.style.Icon({src:ctx.canvas.toDataURL()})})];
        }
});
ol.dom.createCanvasContext2D(60,60)中的60是指画布的大小,后面的ctx.moveTo(30,30)是相对这个画布来说的,(30,30)就是60X60画布的中心点。

3、饼图随地图缩放

map.on('postrender', function(event) {
    var zoom=event.map.getView().getZoom();
    if(zoom!=current_zoom){
        current_zoom=zoom;
        layer.setStyle(function(feature, resolution) {
            var color = ["#27255F","#2F368F","#3666B0","#2CA8E0","#77D1F6"];
            var data = [feature.get("wt1"),feature.get("wt2"),feature.get("wt3")];
            var size=current_zoom*7;
            var ctx = ol.dom.createCanvasContext2D(size,size);
            var startPoint=0;
            for(var i=0;i<data.length;i++){
                ctx.fillStyle = color[i];
                ctx.beginPath();
                var center=size/2;
                var radius=center;
                ctx.moveTo(center,center);
                ctx.arc(center,center,radius,startPoint,startPoint+Math.PI*2*(data[i]/100),false);
                ctx.fill();
                startPoint+=Math.PI*2*(data[i]/100);
            }
            return [new ol.style.Style({image:new ol.style.Icon({src:ctx.canvas.toDataURL()})})];
        });
    }
});

4、显示

var raster = new ol.layer.Tile({
    source: new ol.source.Stamen({
        layer: 'toner'
    })
});
var map=new ol.Map({
    layers:[raster,layer],
    controls : [new ol.control.ScaleLine()],
    view: new ol.View({
        center: ol.proj.transform([116.249084, 40.092781], 'EPSG:4326', 'EPSG:3857'),
        zoom: 9
    }),
    target: 'mapdiv'
});


5、参考

  • Styling Vector Layers:http://ol3js.org/ol3-workshop/vector-style/style.html
  • HTML5绘制饼图实例:http://www.cnblogs.com/happily/archive/2011/11/21/2256826.html



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件列表: OL3Demo\.DS_Store OL3Demo\css\base.css OL3Demo\css\js_demo.css OL3Demo\css\ol.css OL3Demo\demos\.DS_Store OL3Demo\demos\Controls\Animation.htm OL3Demo\demos\Controls\CanvasTiles.htm OL3Demo\demos\Controls\FullScreen.htm OL3Demo\demos\Controls\LayerControl.htm OL3Demo\demos\Controls\LayerSpy.htm OL3Demo\demos\Controls\Measure.htm OL3Demo\demos\Controls\MousePosition.htm OL3Demo\demos\Controls\Operation.htm OL3Demo\demos\Controls\OverviewMap.htm OL3Demo\demos\Controls\ScaleLine.htm OL3Demo\demos\Controls\ZoomSlider.htm OL3Demo\demos\data\geojson\countries-110m.json OL3Demo\demos\data\geojson\countries.geojson OL3Demo\demos\data\geojson\GeoJSON.json OL3Demo\demos\data\geojson\samples.json OL3Demo\demos\data\geolocation-orientation.json OL3Demo\demos\data\geolocation_marker_heading.png OL3Demo\demos\data\gml\gml.xml OL3Demo\demos\data\gml\topp-states-wfs.xml OL3Demo\demos\data\gpx\fells_loop.gpx OL3Demo\demos\data\kml\2012-02-10.kml OL3Demo\demos\data\kml\2012_Earthquakes_Mag5.kml OL3Demo\demos\data\kml\kml.xml OL3Demo\demos\DataHandler.ashx OL3Demo\demos\Drawing\DrawFeatures.htm OL3Demo\demos\Drawing\FeaturesStyle.htm OL3Demo\demos\Drawing\ModifyFeatures.htm OL3Demo\demos\Drawing\MoveFeatures.htm OL3Demo\demos\Drawing\SaveFeatures.htm OL3Demo\demos\Labels\AddClusterLabels.htm OL3Demo\demos\Labels\AddLabels.htm OL3Demo\demos\Labels\AddPopup.htm OL3Demo\demos\MultiData\LoadBasicMaps.htm OL3Demo\demos\MultiData\LoadOpenData.htm OL3Demo\demos\MultiData\LoadPublicMaps.htm OL3Demo\demos\MultiData\LoadTiandituMap.htm OL3Demo\demos\MultiData\MapExport.htm OL3Demo\demos\MultiData\OSM.htm OL3Demo\demos\MultiData\OverLayerMaps.htm OL3Demo\demos\OGC\LoadWCSMap.htm OL3Demo\demos\OGC\LoadWFSFeatrue.htm OL3Demo\demos\OGC\LoadWMSMap.htm OL3Demo\demos\OGC\LoadWMTSMap.htm OL3Demo\demos\OGC\WFS_Transaction.htm OL3Demo\demos\Others\AddPOI.htm OL3Demo\demos\Others\CreatCharts.htm OL3Demo\demos\Others\Geolocation.htm OL3Demo\demos\Others\Heatmap.htm OL3Demo\demos\Others\HotSpots.htm OL3Demo\demos\Others\LoadPublicMaps.htm OL3Demo\demos\Others\MilitaryPlotting.htm OL3Demo\demos\Others\MultiViewLinkage.htm OL3Demo\demos\Others\ProjectionTransformation.htm OL3Demo\demos\Others\SimulateGeolocation.htm OL3Demo\demos\Others\副本 LoadPublicMaps.htm OL3Demo\demos\RegDataHandler.ashx OL3Demo\demos\Web.config OL3Demo\images\ArrowIcon\arbitrary_area.png OL3Demo\images\ArrowIcon\arrow.png OL3Demo\images\ArrowIcon\arrow1.png OL3Demo\images\ArrowIcon\arrowcross.png OL3Demo\images\ArrowIcon\assembly.png OL3Demo\images\ArrowIcon\circle.png OL3Demo\images\ArrowIcon\CircleClosedangleCompass.png OL3Demo\images\ArrowIcon\closedangle.png OL3Demo\images\ArrowIcon\curve_flag.png OL3Demo\images\ArrowIcon\custom_arrow.png OL3Demo\images\ArrowIcon\custom_tail_arrow.png OL3Demo\images\ArrowIcon\custom_tail_arrow_.png OL3Demo\images\ArrowIcon\DoubleClosedangleCompass.png OL3Demo\images\ArrowIcon\double_arrow.png OL3Demo\images\ArrowIcon\fourstar.png OL3Demo\images\ArrowIcon\rect_flag.png OL3Demo\images\ArrowIcon\rhombus.png OL3Demo\images\ArrowIcon\SameDirectionClosedangleCompass.png OL3Demo\images\ArrowIcon\singleLine_arrow.png OL3Demo\images\ArrowIcon\smooth_curve.png OL3Demo\images\ArrowIcon\stright_arrow.png OL3Demo\images\ArrowIcon\tail_arrow.png OL3Demo\images\ArrowIcon\triangle.png OL3Demo\images\ArrowIcon\triangle_flag.png OL3Demo\images\ArrowIcon\VaneCompass.png OL3Demo\images\content\dotted.png OL3Demo\images\label\bj.png OL3Demo\images\label\blueIcon.png OL3Demo\images\label\icon.png OL3Demo\images\label\restaurant.png OL3Demo\images\label\国有企业.png OL3Demo\images\left\app.png OL3Demo\images\left\app_current.png OL3Demo\images\left\channel.png OL3Demo\images\left\channel_current.png OL3Demo\images\left\cloud.png OL3Demo\images\left\cloud_current.png OL3Demo\images\left\custom.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值