openscale中projection,resolution,比例尺的概念

本文探讨了openscales2.2版本中地图缩放时文字大小变化的问题,并深入解析了地图缩放机制的变化。此外,还介绍了计算地理对象的距离与面积的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、比例尺本身虽然没有单位:1:15000,但它的两个数字是有单位的。表示1厘米代表15000厘米,即150米。而不是1厘米代表15000米。

1:5000000的地图,表示1厘米代表50000米,即5公里。


转载:问题描述:

在openscales2.2版本中,如果有地物标注的文字时,文字会随着地图的缩放而变换字体的大小。比如文字标注设定的字体为12号字,那么在地图的缩放过程中,显示的字体会时而小与12号字体时而为12号字体。



问题的原因:

出现这种现象的原因是在openscales以前版本中(1.2版本),是有一个zoom(默认为1-18)属性,地图根据鼠标滚轮的滚动,对zoom属性进行+1或-1操作,然后在map中的resolutions数组中查找zoom对应的resolution值,这样能够保证地图的总体缩放级别,也能够保证地图的动态请求切片每次都是以256*256像素添加到地图上的。而在openscales2.2版本中,地图的鼠标缩放是由一组放大缩小因数控制的,放大因数为0.9,缩小因数为1.11,这样设置使得每次鼠标滚轮的转动,使得地图缩放的等级不是严格按照map中的resolution数组进行缩放,所以使得当请求到大小为256*256的图片加载到地图上时,会因为resolution值得原因,不是严格以256*256的像素大小展示,也就是说256*256大小的图片被压缩了。所有在map中的resolutions数组中的每个相邻resolution值之间,图片是由上一级别的图片缩小或拉伸填充,直到达到该分辨率时,才会重新请求。



2、linestring.as

计算距离的方法      

        public function get geodesicLength():Number
        {
            var geom:LineString = this;  // so we can work with a clone if needed
            var lonlatProj:ProjProjection = ProjProjection.getProjProjection("EPSG:4326");
            if(lonlatProj != this.projection) {
                geom = this.clone() as LineString;
                geom.transform(lonlatProj);
            }
            var length:Number = 0;
            if(geom.components && (geom.components.length >= 4)) {
                var p1:flash.geom.Point;
                var p2:flash.geom.Point;
                for(var i:int=3, len:int=geom.components.length; i<len; i=i+2) {
                    p1 = new flash.geom.Point(geom.components[i-3], geom.components[i-2]);
                    p2 =  new flash.geom.Point(geom.components[i-1], geom.components[i]);
                    // this returns km and requires lon/lat properties
                    length += ProjCalculus.distVincenty(p1,p2);
                }
            }
            // convert to m
            return length * 1000;
        }

                       调用(Distance.as)...

                        tmpDist *= Unit.getInchesPerUnit(ProjProjection.getProjProjection(measure_drawLayer.projection).projParams.units);
                        var distance_displaySystem:String = Unit.KILOMETER;
                        var tmpDist:Number=0;
                        //trace("jasdfasdf:" + _displaySystem);
                        switch (distance_displaySystem.toLowerCase())
                        {                    
                            case Unit.METER:
                                tmpDist = (distance_LineFeature.geometry as LineString).geodesicLength;
                                //tmpDist/=Unit.getInchesPerUnit(Unit.METER);
                                trace(tmpDist + "," + "asdad");
                                distance_result= trunc(tmpDist,distance_accuracies.getValue(Unit.METER));
                                distance_unit = Unit.METER;
                                break;

3、linearRing.as

        计算面积的方法

        public function get geodesicArea():Number
        {
            var ring:LinearRing = this;  // so we can work with a clone if needed
            var lonlatProj:ProjProjection = ProjProjection.getProjProjection("EPSG:4326");
            if(lonlatProj != this.projection) {
                ring = this.clone() as LinearRing;
                ring.transform(lonlatProj);
            }
            var area:Number = 0;
            var len:Number = ring.components.length;
            if(len > 4) {
                var p1:Point;
                var p2:Point;
                for(var i:int=0; i<len-2; i=i+2) {
                    p1 = new Point(ring.components[i], ring.components[i+1]);
                    p2 = new Point(ring.components[i+2], ring.components[i+3]);
                    area += ProjCalculus.degtoRad(p2.x - p1.x) * (2 + Math.sin(ProjCalculus.degtoRad(p1.y)) + Math.sin(ProjCalculus.degtoRad(p2.y)));
                }
                p1 = new Point(ring.components[len-2], ring.components[len-1]);
                p2 = new Point(ring.components[0], ring.components[1]);
                area += ProjCalculus.degtoRad(p2.x - p1.x) * (2 + Math.sin(ProjCalculus.degtoRad(p1.y)) + Math.sin(ProjCalculus.degtoRad(p2.y)));
                area = area * 6378137.0 * 6378137.0 / 2.0;
            }
            return area;
        }

                调用..
                if(opemode==5)
                {
                    var area:Number = 0;
                    if(surface_PolygnFeature && (surface_PolygnFeature.geometry as Polygon).componentsLength == 1
                        && ((surface_PolygnFeature.geometry as Polygon).componentByIndex(0) as LinearRing).componentsLength>2)
                    {
                        var surface_units:String=ProjProjection.getProjProjection(measure_drawLayer.projection).projParams.units;
                        ((surface_PolygnFeature.geometry as Polygon).componentByIndex(0) as LinearRing).units = surface_units
                        
                        area = ((surface_PolygnFeature.geometry as Polygon).componentByIndex(0) as LinearRing).geodesicArea;
                        area = Math.abs(area);
                        //

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值