arcgis for Android 100.2 绘制点线面(文末有三维地图) arcgis for Android 100.2 加载shp

这是这阶段arcgis for Android 的最后一篇了,前面有三篇。对于我经常使用坐标,进行绘制点线面图形的程序员,这个必须要的。因为在项目中经常用到。

arcgis for Android 100.1 基本操作(缩小放大旋转定位)

arcgis for Android 100.1 在线加载天地图和谷歌地图

arcgis for Android 100.2 加载shp

1、效果显示



2、代码实现

package com.arcgis.activity;

import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.arcgis.R;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PolygonBuilder;
import com.esri.arcgisruntime.geometry.PolylineBuilder;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.geometry.SpatialReferences;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.Viewpoint;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.LocationDisplay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.PictureMarkerSymbol;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.esri.arcgisruntime.symbology.SimpleRenderer;

public class ArcgisDrawActivity extends AppCompatActivity implements View.OnClickListener {
    private String mapServerUrl = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer";
    private MapView mMapView;
    LocationDisplay locationDisplay;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_2);
        mMapView = (MapView) findViewById(R.id.map_view);

        initView();
    }

    private void initView() {
        findViewById(R.id.button4).setOnClickListener(this);
        findViewById(R.id.button5).setOnClickListener(this);
        findViewById(R.id.button6).setOnClickListener(this);
        findViewById(R.id.button7).setOnClickListener(this);

        ArcGISTiledLayer tiledLayer = new ArcGISTiledLayer(mapServerUrl);

        Basemap basemap = new Basemap(tiledLayer);

        ArcGISMap map = new ArcGISMap(basemap);

        mMapView.setMap(map);

        locationDisplay = mMapView.getLocationDisplay();
        locationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.RECENTER);
        locationDisplay.startAsync();

        locationDisplay = mMapView.getLocationDisplay();
        Resources resources=getResources();
        BitmapDrawable bitmapDrawable= new BitmapDrawable(BitmapFactory.decodeResource(resources,R.drawable.arcgisruntime_location_display_default_symbol));
        final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable);
        campsiteSymbol.loadAsync();
        campsiteSymbol.addDoneLoadingListener(new Runnable() {
            @Override
            public void run() {
                locationDisplay.setDefaultSymbol(campsiteSymbol);//设置默认符号
                locationDisplay.setShowAccuracy(false);//隐藏符号的缓存区域
            }
        });

    }


    protected void onResume() {
        super.onResume();
        mMapView.resume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.pause();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button4://放大
                Point point = locationDisplay.getMapLocation();

                ArcGISMap map = new ArcGISMap(Basemap.createImageryWithLabelsVector());

                //center for initial viewpoint
                // 这个Point是按照经纬度模式 跟osmdroid定位刚好反过来
                //patialReference.create(4326) 参考坐标系   4326 是WGS84 的坐标
//                Point center = new Point(113.365548756, 23.12648183, SpatialReference.create(4326));

                //set initial viewpoint
                //9000 是缩放比例   这缩放比例参数也是独树一帜啊
                map.setInitialViewpoint(new Viewpoint(point, 9000));

                // set the map to the map view
                mMapView.setMap(map);
                break;
            case R.id.button5://
                // point graphic
                Point pointGeometry = new Point(113.365548856, 23.12698183, SpatialReferences.getWgs84());
                // red diamond point symbol
                SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
                // create graphic for point
                Graphic pointGraphic = new Graphic(pointGeometry);
                // create a graphic overlay for the point
                GraphicsOverlay pointGraphicOverlay = new GraphicsOverlay();
                // create simple renderer
                SimpleRenderer pointRenderer = new SimpleRenderer(pointSymbol);
                pointGraphicOverlay.setRenderer(pointRenderer);
                // add graphic to overlay
                pointGraphicOverlay.getGraphics().add(pointGraphic);
                // add graphics overlay to the MapView
                mMapView.getGraphicsOverlays().add(pointGraphicOverlay);
                break;
            case R.id.button6://
                // line graphic
                PolylineBuilder lineGeometry = new PolylineBuilder(SpatialReferences.getWgs84());
                lineGeometry.addPoint(113.365548756, 23.12648183);
                lineGeometry.addPoint(113.362548856, 23.12548283);
                // solid blue line symbol
                SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLUE, 5);
                // create graphic for polyline
                Graphic lineGraphic = new Graphic(lineGeometry.toGeometry());
                // create graphic overlay for polyline
                GraphicsOverlay lineGraphicOverlay = new GraphicsOverlay();
                // create simple renderer
                SimpleRenderer lineRenderer = new SimpleRenderer(lineSymbol);
                // add graphic to overlay
                lineGraphicOverlay.setRenderer(lineRenderer);
                // add graphic to overlay
                lineGraphicOverlay.getGraphics().add(lineGraphic);
                // add graphics overlay to the MapView
                mMapView.getGraphicsOverlays().add(lineGraphicOverlay);
                break;
            case R.id.button7://
                //polygon graphic
                PolygonBuilder polygonGeometry = new PolygonBuilder(SpatialReferences.getWgs84());
                polygonGeometry.addPoint(113.366548156, 23.12248283);
                polygonGeometry.addPoint(113.362548356, 23.12348383);
                polygonGeometry.addPoint(113.368548656, 23.12248683);
                polygonGeometry.addPoint(113.367548956, 23.127648983);
                // solid yellow polygon symbol
                SimpleFillSymbol polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, null);
                // create graphic for polygon
                Graphic polygonGraphic = new Graphic(polygonGeometry.toGeometry());
                // create graphic overlay for polygon
                GraphicsOverlay polygonGraphicOverlay = new GraphicsOverlay();
                // create simple renderer
                SimpleRenderer polygonRenderer = new SimpleRenderer(polygonSymbol);
                // add graphic to overlay
                polygonGraphicOverlay.setRenderer(polygonRenderer);
                // add graphic to overlay
                polygonGraphicOverlay.getGraphics().add(polygonGraphic);
                // add graphics overlay to MapView
                mMapView.getGraphicsOverlays().add(polygonGraphicOverlay);
                break;

        }

    }

}

这里有一个注意就是,画图的用经纬度是在那个坐标系统下面的。一般来说都是使用WGS84坐标。

3、这里看一个三维地图,挺好玩的


实现代码很简单

package com.arcgis.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.arcgis.R;
import com.arcgis.until.TianDiTuMethodsClass;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.ArcGISSceneLayer;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.WebTiledLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.ArcGISScene;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.mapping.view.SceneView;


public class ArcgisThreeDimensionalMapActivity extends AppCompatActivity {
    private SceneView sceneView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scene);
        sceneView = (SceneView) findViewById(R.id.sceneview);

        ArcGISScene arcGISScene = new ArcGISScene(Basemap.createImagery());

        ArcGISSceneLayer arcGISSceneLayer = new ArcGISSceneLayer(
                "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer");
        arcGISScene.getOperationalLayers().add(arcGISSceneLayer);
        sceneView.setScene(arcGISScene);
    }


    protected void onResume() {
        super.onResume();
        sceneView.resume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        sceneView.pause();
    }
}

最后还是一样注意权限

还有就是你的编译版本是6.0及以上,需要权限管理,动态加载。

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

到这里就结束吧,稍后我会把这四篇文章的代码打包csdn下载


猜你喜欢

转载自blog.csdn.net/qq_16064871/article/details/80711346