MapBoxMap 之 FillLayer(围栏)

FillLayer:具有可选描边边框的填充多边形。

View On Github

这个其实与其它地图中的Polygon类似,多边形的形状取决于你添加点的集合。

 

预览一下效果:

                    

        图1 颜色填充多边形                                               图2 图片填充多边形

 

FillLayer添加到地图

 FillLayer初始化

public class FillLayerActivity extends AppCompatActivity {
    private static final String FILL_SOURCE_ID = "fill-source-id";
    private static final String FILL_LAYER_ID = "fill-layer-id";
    private static final String FILL_IMAGE_ID = "fill-image-id";

    private MapView mapView;
    private GeoJsonSource geoJsonSource;
    private FillLayer fillLayer;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fill_layer);

        //忽略其他view初始化...

        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull final MapboxMap mapboxMap) {
                mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull final Style style) {
                        initFillLayer(style, switchUseImage.isChecked());
                    }
                });
            }
        });;
    }

    private void initFillLayer(Style style, boolean isUseImage) {
        //Source
        geoJsonSource = new GeoJsonSource(FILL_SOURCE_ID);
        style.addSource(geoJsonSource);
        //Layer
        fillLayer = new FillLayer(FILL_LAYER_ID, FILL_SOURCE_ID).withProperties(
                //填充抗锯齿 默认为true
                PropertyFactory.fillAntialias(true),
                //填充内部填充色
                PropertyFactory.fillColor(Config.BLUE_COLOR),
                //填充不透明度
                PropertyFactory.fillOpacity(0.5f),
                //填充轮廓线颜色
                PropertyFactory.fillOutlineColor(Config.RED_COLOR),
                //填充模式  可选的resolveImage。 Sprite中用于绘制图像填充的图像名称。对于无缝图案,图像的宽度和高度必须是两倍(2、4、8,...,512)。请注意,仅在整数缩放级别会评估与缩放相关的表达式。
//                PropertyFactory.fillPattern(FILL_IMAGE_ID),
                //填充排序键 基于此值按升序对要素进行排序。具有较高排序键的功能将显示在具有较低排序键的功能上方。
//                PropertyFactory.fillSortKey(),
                //填充翻译 几何的偏移量, 默认为0,0。值为[x,y],其中负数分别表示左和上。 以像素为单位
                PropertyFactory.fillTranslate(new Float[]{0f, 0f}),
                /*
                 * 填充翻译锚 可选的枚举 "map" "viewport" 之一。默认为"map"。需要设置fill-translate。
                 * "map":填充相对于地图进行转换。
                 * "viewport":填充相对于视口平移。
                 */
                PropertyFactory.fillTranslateAnchor(Property.FILL_TRANSLATE_ANCHOR_MAP),
                //可见性 默认为可见
                PropertyFactory.visibility(Property.VISIBLE)
        );
        if (isUseImage){
            //image
            Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher_round);
            style.addImage(FILL_IMAGE_ID, drawable);
            fillLayer.setProperties(PropertyFactory.fillPattern(FILL_IMAGE_ID));
            Toast.makeText(this, "等待图源加载完成...", Toast.LENGTH_SHORT).show();
        }
        style.addLayer(fillLayer);
    }
}

绘制类型

1.添加多边形

 private void addFillLayerOnMap() {
    List<List<Point>> points = new ArrayList<>();
    points.add(Config.POLYGON_COORDINATES);
    geoJsonSource.setGeoJson(Polygon.fromLngLats(points));
}

 

2.添加有空洞的多边形

private void addFillLayerOnMapWithHole() {
        LineString outerLineString = LineString.fromLngLats(Config.POLYGON_COORDINATES);
        List<LineString> innerList = new ArrayList<>();
        for (int i = 0; i < Config.HOLE_COORDINATES.size(); i++) {
            LineString innerLineString = LineString.fromLngLats(Config.HOLE_COORDINATES.get(i));
            innerList.add(innerLineString);
        }
        geoJsonSource.setGeoJson(Polygon.fromOuterInner(outerLineString, innerList));
    }

 

动态更新

1.显示与隐藏

if (Property.VISIBLE.equals(fillLayer.getVisibility().getValue())) {

     fillLayer.setProperties(PropertyFactory.visibility(Property.NONE));
 } else {

     fillLayer.setProperties(PropertyFactory.visibility(Property.VISIBLE));
 }

2.更改透明度

int fillColorAsInt = fillLayer.getFillColorAsInt();

if (Config.BLUE_COLOR == fillColorAsInt) {
                                    
    fillLayer.setProperties(PropertyFactory.fillColor(Config.RED_COLOR)
                                            , 
    PropertyFactory.fillOutlineColor(Config.BLUE_COLOR)
                                            , PropertyFactory.fillOpacity(0.8f));
} else {
                                    
    fillLayer.setProperties(PropertyFactory.fillColor(Config.BLUE_COLOR)
                                            , 
    PropertyFactory.fillOutlineColor(Config.RED_COLOR)
                                            , PropertyFactory.fillOpacity(0.5f));
}

数据源

static final class Config {
        static final int BLUE_COLOR = Color.parseColor("#3bb2d0");
        static final int RED_COLOR = Color.parseColor("#AF0000");
        
        //多边形的点的集合
        static final List<Point> POLYGON_COORDINATES = new ArrayList<Point>() {
            {
                add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
                add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
                add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
                add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
                add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
                add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
                add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
                add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
                add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
            }
        };
        //孔洞点的集合
        static final List<List<Point>> HOLE_COORDINATES = new ArrayList<List<Point>>() {
            {
                add(new ArrayList<>(new ArrayList<Point>() {
                    {
                        add(Point.fromLngLat(55.30084858315658, 25.256531695820797));
                        add(Point.fromLngLat(55.298280197635705, 25.252243254705405));
                        add(Point.fromLngLat(55.30163885563897, 25.250501032248863));
                        add(Point.fromLngLat(55.304059065092645, 25.254700192612702));
                        add(Point.fromLngLat(55.30084858315658, 25.256531695820797));
                    }
                }));
                add(new ArrayList<>(new ArrayList<Point>() {
                    {
                        add(Point.fromLngLat(55.30173763969924, 25.262517391695198));
                        add(Point.fromLngLat(55.301095543307355, 25.26122200491396));
                        add(Point.fromLngLat(55.30396028103232, 25.259479911263526));
                        add(Point.fromLngLat(55.30489872958182, 25.261132667394975));
                        add(Point.fromLngLat(55.30173763969924, 25.262517391695198));
                    }
                }));
            }
        };
    }

 

多边形的应用最多用于围栏功能

地图上的围栏目的:监听目标与围栏的位置关系。

对在于目标在围栏内的,出围栏需要告警通知。

对在于目标在围栏外的,进入围栏需要告警通知。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值