精华内容
下载资源
问答
  • 京津冀GIS底图

    2015-06-27 12:31:44
    京津冀GIS底图,京津冀区域的底图都有,可以借助GIS软件应用对京津冀进行数据处理
  • 全国省-市-县GIS地图以及世界GIS底图-shp格式 很好
  • 长江经济带地级市GIS底图 SHP格式,方便ARCGIS学习者使用 长江经济带地级市GIS底图 SHP格式,方便ARCGIS学习者使用
  • 中国地级市GIS底图

    2015-03-27 17:01:00
    arcgis底图,中国地级市各种图,非常好用~~有问题可以留言哦~ 另外,寻求其他arcgis底图资源~~
  • 云南省行政gis底图

    2020-03-14 12:58:43
    2015版,行政区到每个县
  • 自己描的县区尺度的山东省GIS地图,shp格式,做研究出的化精度还可以。
  • 天津地理信息地图gis文件,包括区界和道路等下载后就会发现原来好全面。
  • GIS地图学习笔记五之底图的缓存

    千次阅读 2017-12-28 18:05:27
    Gis底图的缓存一般都是使用切片,不是把切片放在本地直接读取就是利用切片生成tpk或者mmpk文件读取,今天就讲一下使用.MBTiles/.db(都是sqlite的数据库,MBTiles其实就是sqlite3的数据库,是给移动平台离线存储用的...

    Gis底图的缓存一般都是使用切片,不是把切片放在本地直接读取就是利用切片生成tpk或者mmpk文件读取,今天就讲一下使用.MBTiles/.db(都是sqlite的数据库,MBTiles其实就是sqlite3的数据库,是给移动平台离线存储用的)。

    官方文档地址:https://developers.arcgis.com/android/latest/guide/tasks-and-jobs.htm

    如果你的地图是发布在ArcGIS Server上,也可以看这里客户端使用地图缓存的方法


    SQLite数据库实现缓存

    1、数据库文件

    这里写图片描述

    0-14,表示地图包括的图层


    2、读取文件

    可以把文件放到APK安装包中,也可以放在服务器上让用户下载
    这里写图片描述

    public class MyUtils {
         public final static String File_name = "shijiazhuan_Road-0-14.db";
         public final static String Package_name = "com.cnbs.cableinspection"; //项目包路径
         public final static String Save_Path = "/data"
                 + Environment.getDataDirectory().getAbsolutePath()+"/"
                 + Package_name
                 +"/arcgis";
    
         public static void saveAssetsToSD(Context context) {
             try {
                 String filename = Save_Path + "/" + File_name;
                 File dir = new File(Save_Path);
                 if (!dir.exists()) {
                     dir.mkdir();
                 }
                 if (!(new File(filename)).exists()) {
                     InputStream is = context.getResources().getAssets().open(File_name);//assets目录下资源文件名
                     FileOutputStream fos = new FileOutputStream(filename);
                     byte[] buffer = new byte[1024];
                     int count = 0;
                     while ((count = is.read(buffer)) > 0) {
                         fos.write(buffer, 0, count);
                     }
                     fos.close();
                     is.close();
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
         ...
     }    

    Application中把db文件写入手机内存

    MyUtils.saveAssetsToSD(this);

    3、重写切片加载图层

    public class DBTiledLayer extends ImageTiledLayer {
        private SQLiteDatabase mapDb;
        private int mLevels = 0;
    
    
        public static DBTiledLayer init(String path) {
            SQLiteDatabase mapDb;
            int mLevels = 0;
            try {
                mapDb = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
            } catch (SQLException ex) {
                Log.e("MBTiles", ex.getMessage());
                throw (ex);
            }
    
            // Default TMS bounds = bounds of Web Mercator projection
            Envelope envWGS = new Envelope(-180.0, -85.0511, 180.0, 85.0511, SpatialReferences.getWgs84());
    
            // See if the MBTiles DB defines their own Bounds in the metadata table
            Cursor bounds = mapDb.rawQuery("SELECT value FROM metadata WHERE name = 'bounds'", null);
            if (bounds.moveToFirst()) {
                String bs = bounds.getString(0);
                String[] ba = bs.split(",", 4);
                if (ba.length == 4) {
                    double leftLon = Double.parseDouble(ba[0]);
                    double topLat = Double.parseDouble(ba[3]);
                    double rightLon = Double.parseDouble(ba[2]);
                    double bottomLat = Double.parseDouble(ba[1]);
    
                    envWGS = new Envelope(leftLon, bottomLat, rightLon, topLat, SpatialReferences.getWgs84());
                }
            }
    
            Envelope envWeb = (Envelope) GeometryEngine.project(envWGS,
                    SpatialReferences.getWebMercator());
    
            Point origin = new Point(envWeb.getXMin(), envWeb.getYMax(), envWeb.getSpatialReference());
    
            Cursor maxLevelCur = mapDb.rawQuery("SELECT MAX(zoom_level) AS max_zoom FROM tiles", null);
            if (maxLevelCur.moveToFirst()) {
                mLevels = maxLevelCur.getInt(0);
            }
    
            Log.i("TAG", "Max levels = " + Integer.toString(mLevels));
    
            double[] resolution = new double[mLevels];
            double[] scale = new double[mLevels];
            List<LevelOfDetail> lod = new ArrayList<>(mLevels);
            for (int i = 0; i < mLevels; i++) {
                // see the TMS spec for derivation of the level 0 scale and resolution
                // For each level the resolution (in meters per pixel) doubles
                resolution[i] = 156543.032 / Math.pow(2, i);
                // Level 0 scale is 1:554,678,932. Each level doubles this.
                scale[i] = 554678932 / Math.pow(2, i);
                lod.add(new LevelOfDetail(i, resolution[i], scale[i]));
            }
    
        /*
         * Note, the constructor must set the following values or we won't send the
         * status change events to listeners and the tiles will not be fetched
         *
         * Origin is Top Left (web Mercator) , the rest are defined by the TMS
         * Global-mercator spec (scales, resolution, 96dpi 256x256 pixel tiles) See:
         * http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-mercator
         */
            TileInfo ti = new TileInfo(96, TileInfo.ImageFormat.PNG, lod, origin, origin.getSpatialReference(), 256, 256);
    
            return new DBTiledLayer(ti, envWeb, mapDb, mLevels);
    
        }
    
        private DBTiledLayer(TileInfo tileInfo, Envelope fullExtent, SQLiteDatabase mapDb, int mLevels) {
            super(tileInfo, fullExtent);
            this.mapDb = mapDb;
            this.mLevels = mLevels;
        }
    
    
        @Override
        protected byte[] getTile(TileKey tileKey) {
            // need to flip origin
            int nRows = (1 << tileKey.getLevel()); // Num rows = 2^level
            int tmsRow = nRows - 1 - tileKey.getRow();
    
            Cursor imageCur = mapDb.rawQuery("SELECT tile_data FROM tiles WHERE zoom_level = " + Integer.toString(tileKey.getLevel())
                    + " AND tile_column = " + Integer.toString(tileKey.getColumn()) + " AND tile_row = " + Integer.toString(tmsRow), null);
            if (imageCur.moveToFirst()) {
                return imageCur.getBlob(0);
            }
            return null; // Alternatively we might return a "no data" tile
        }
    }

    4、离线加载地图

     if (isOffline) {
                String filename = MyUtils.Save_Path + "/" + MyUtils.File_name;
                if (!(new File(filename)).exists())return;//防止闪退
                DBTiledLayer tiledLayer = DBTiledLayer.init(filename);
                tiledLayer.setMinScale(MinScale);  //控制缩小,数值越大,缩小倍数越大,看的范围越广
                tiledLayer.setMaxScale(MaxScale);   //控制放大,数值越小,放大倍数越高
                Basemap basemap = new Basemap(tiledLayer);
                mArcGISMap = new ArcGISMap(basemap);
            }

    ExportTileCacheTask缓存实现


    1、看文档

    首先我们查看文档ArcGIS Runtime SDK for Android下的Fundamentals –> Tasks and jobs

    这里写图片描述

    红框内的文字翻译出来大概是:

    • 使用GeodatabaseSyncTask下载,收集和更新地理信息
    • 使用ExportTileCacheTask下载并显示平铺底图
    • 使用LocatorTask查找地址并从地图位置查找地址
    • 使用RouteTask计算点对点或多站路线,并获取驾车路线
    • 使用GeoprocessingTask执行地理处理模型来执行复杂的GIS分析

    任务要么直接从Task的异步方法返回结果,要么使用jobs来提供状态更新和结果。其中直接从任务上的异步方法返回结果的有LocatorTask.geocodeAsyncRouteTask.solveRouteAsync。 对于更复杂或更长时间的运行操作,任务将改为使用作业jobs

    通过文档我们就知道了缓存底图我们需要的是ExportTileCacheTask这个类。

    那么我们要用到的ExportTileCacheTask就需要使用ExportTileCacheTaskjobExportTileCacheJob来提供状态更新和结果了。


    2、使用Task

    2-1、使用直接返回结果的Task

    LocatorTaskRouteTask

    1、通过初始化任务来创建任务以使用所需的数据或服务。

    • 一些操作可以在线和离线使用。

    2、定义任务输入。

    • 一些操作只需要简单的值输入(例如,一个简单的地理编码操作可能只需要一个地址字符串作为输入)。
    • 其他需要定义参数(例如,将地理编码操作限制到特定的国家/地区)。

    3、调用异步操作方法,传递你定义的输入。
    4、根据需要使用操作的结果,例如在地图上显示地理编码结果。

    我们这篇文章主要介绍使用ExportTileCacheTask来缓存底图,LocatorTaskRouteTask这些直接返回结果的Task就不做过多介绍了,可以去官方文档查看。


    2-2、使用直接返回结果的Task

    1、通过初始化任务来创建任务以使用所需的数据或服务。

    ExportTileCacheTask cacheTask = new ExportTileCacheTask(mMapUrl);

    2、定义任务的输入参数。

    public String mMapUrl= "http://119.97.224.2:8399/PBS/rest/services/MapsRoad/MapServer";   //街道图

    3、调用异步操作方法获取作业,并传入您定义的输入参数。

    ExportTileCacheJob cacheJob = cacheTask.exportTileCacheAsync(cacheParameters, mExportPath + "/" +  "test.tpk");

    4、开始工作。

     cacheJob.start();

    5、(可选)监听作业状态的更改并检查作业消息,例如更新UI并向用户报告进度。

    cacheJob.addJobChangedListener(new Runnable() {
      @Override
      public void run() {
        List<Job.Message> messages = cacheJob.getMessages();
        updateUiWithProgress(messages.get(messages.size() - 1).getMessage());
      }
    });

    6、监听工作完成情况,并从操作中获得结果。检查作业中的错误,如果成功,请使用结果。

    cacheJob.addJobDoneListener(new Runnable() {
      @Override
      public void run() {
        if (cacheJob.getError() != null) {
          dealWithException(exportJob.getError()); 
          return;
        }
        if (cacheJob.getStatus() == Job.Status.SUCCEEDED) {
          final TileCache result= cacheJob.getResult();
          ArcGISTiledLayer tiledLayer = new ArcGISTiledLayer(result);
          mapView.getMap().getOperationalLayers().add(tiledLayer);
        }
      }
    });
    

    * 方法完整代码*

    final ExportTileCacheTask cacheTask = new ExportTileCacheTask(mMapUrl);
            ExportTileCacheParameters cacheParameters = new ExportTileCacheParameters();
            cacheParameters.getLevelIDs().addAll(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
            //计算中心点
            int measuredWidth = mMapView.getMeasuredWidth();
            int measuredHeight = mMapView.getMeasuredHeight();
            android.graphics.Point point = new android.graphics.Point(measuredWidth / 2, measuredHeight / 2);
            Point centerDot = mMapView.screenToLocation(point);
            cacheParameters.setAreaOfInterest(new Envelope(centerDot,measuredWidth*5,measuredHeight*5));
            String date = MyDateTimeUtils.hasNowDate();
            final ExportTileCacheJob cacheJob = cacheTask.exportTileCacheAsync(cacheParameters,  mExportPath + "/" + date + ".tpk");
            cacheJob.addJobChangedListener(new Runnable() {
                @Override
                public void run() {
                    List<Job.Message> messages = cacheJob.getMessages();
    //                updateUiWithProgress(messages.get(messages.size() - 1).getMessage());
                }
            });
            cacheJob.addJobDoneListener(new Runnable() {
                @Override
                public void run() {
                    if (cacheJob.getError() != null) {
                        ArcGISRuntimeException error =cacheJob.getError();
    //                    return;
                    }
                    if (cacheJob.getStatus() == Job.Status.SUCCEEDED) {
                        final TileCache exportedTileCache = cacheJob.getResult();
                        ArcGISTiledLayer tiledLayer = new ArcGISTiledLayer(exportedTileCache);
                        mMapView.getMap().getOperationalLayers().add(tiledLayer);
                    }
                }
            });
            cacheJob.start();

    2-3、示例代码

    下载官方demo,运行这个Module

    这里写图片描述

    参考文章:
    1、Android开发,arcgis自定义layer-历史影像和地图缓存的实现
    2、arcgis for android 本地缓存


    展开全文
  • GIS - 底图,怎么做怎么选择

    千次阅读 2019-04-27 18:38:38
    底图往往是一些基础信息,比如行政区、街道、水系,它们变动较少,一般放在图层最下方。底图一般使用栅格瓦片,栅格瓦片有其自身局限性: 地理信息内容改变,栅格瓦片无法做到实时更新。栅格瓦片需要预生成,生成...

    底图往往是一些基础信息,比如行政区、街道、水系,它们变动较少,一般放在图层最下方。底图一般使用栅格瓦片,栅格瓦片有其自身局限性:

    1. 地理信息内容改变,栅格瓦片无法做到实时更新。栅格瓦片需要预生成,生成以后不能改变,如果地理信息有变动,那么需要重新生成瓦片
    2. 样式改变,如果需要不同样式的底图,需要额外生成一份瓦片。不同样式,存储多份相同的数据。

    于是矢量瓦片的概念被提出,矢量瓦片也是瓦片,是矢量,在浏览器端渲染,可以只请求一次,渲染出不同样式。因此解决了栅格瓦片的2问题。然而,多份底图的需求是真实需求吗?这得分两方面:

    • 对于toC来说,意义不大,用户对底图甚至都不会太关注
    • 对于toB,或者研究机构来说,意义较大,用户用特色鲜明的底图,来衬托要说明的数据。

    当前来说,GIS一般是toB的,所以底图最好使用矢量瓦片。然而,矢量瓦片也没有解决地理信息内容改变,瓦片实时更新的问题,或者说一天一更新也可以接受,能想到的思路可能就是,将新数据与原数据对比,只更新数据库中涉及的条目,并生成内容有改变的区域涉及的瓦片。

    还有一个问题没有考虑到,如果后端返回矢量瓦片,那么渲染到任务就交到了前端做,那么那些复杂到样式就需要用户来做,要简化操作,就必须做SDK,如果使用你提供的底图还需要再学习一个SDK,感觉这也不是很好,好的做法应该是返回栅格切片,让用的比较多的SDK都可以顺利调用,比如openlayers、leaflet。

    可用的技术

    • 生成

    PostGIS可以将PostgreSQL中存储的地理数据生成矢量瓦片;

    Tippecanoe,可以将GeoJSON直接生成矢量瓦片,并存储在sqlite中,称为mbtiles;

    Mapnik既可以将PostGIS中数据生成矢量瓦片,也可以将矢量瓦片作为输入,生成栅格地图切片;

    MapServer可以将PostGIS中将数据生成矢量瓦片,但不能将矢量瓦片作为输入,生成栅格地图切片。

    • 缓存

    将请求过的矢量切片缓存起来,下次请求直接返回缓存中的结果。

    发布一个道路底图

    这里我们使用MapServer发布一个道路地图。发布底图不仅仅需要渲染线状道路,还要添加道路名称,即地图标注。标注需要的中文字体,系统中可能没有,因此,我们首先需要添加需要的中文字体到系统中。

    展开全文
  • 华北各县GIS图

    2014-05-15 09:24:11
    华北县GIS底图,分县(整个华北,不仅包括河北、河南、山东、北京、天津、还包括内蒙古部分等地区哦)
  • GIS开发:mapbox gl几种底图的加载

    千次阅读 2020-05-09 09:20:46
    mapbox gl除了加载客户端可控制样式的底图,也能够加载常规的影像底图。 这里指发布的影像或者矢量地图切片,在线经常使用的有天地图,谷歌地图、高德百度等,底图的加载,mapbox gl中,主要是修改对应的样式style。...

    mapbox gl除了加载客户端可控制样式的底图,也能够加载常规的影像底图。
    这里指发布的影像或者矢量地图切片,在线经常使用的有天地图,谷歌地图、高德百度等,底图的加载,mapbox gl中,主要是修改对应的样式style。

    //这是加载arcgis server发布的底图切片
    <div id='map'></div>
    <script>
    var map = new mapboxgl.Map({
    	container: 'map',
    	style: {
            //目前地图的版本用8
    		"version": 8,
              //数据源,可以设置多个数据源
    		 "sources": {
    			"mapsource": {
              //数据源类型是 raster
    			"type": "raster", 
              //切片的地址:arcgis server 只有发布了切片才能这样进行访问,具体参照arcgis server的wmts发布
    			"tiles":   ['http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/WMTS/tile/1.0.0/ChinaOnlineCommunity/default/default028mm/{z}/{y}/{x}.png']
             //切片的尺寸,一般都是256
                         "tileSize": 256,
    			} 
    		},
            //加载数据源里的图层
    		"layers": [{
    				"id": "mapsource",
    				"type": "raster",
              //数据源选择source中的id
    				"source": "mapsource",
            //设置图层的可缩放级别
    				"minzoom": 0,
    				"maxzoom": 18
    				} ]
    				}
    			});
    		</script>
    //加载天地图的矢量和注记图层
    
    style: {
    	"version": 8,
    	"sources": {
    	"mapsource": {
    	"type": "raster",
      //天地图的影像切片,现在天地图需要申请token
    "tiles": 
    
    ['http://t1.tianditu.com/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&format=tiles&tk=<your token>'],
    
    							"tileSize": 256,
    
    	},
    
           //注记的数据源,source中可以添加多个
    
    	annotationsource": {
    	"type": "raster",
    	"tiles": [' http://t0.tianditu.com/cva_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cva&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&format=tiles&tk=<your token>'],
    							"tileSize": 256,
    						}
       },
    
     //分别加载多个天地图的图层
    	"layers": [{
    		"id": "mapsource",
    		"type": "raster",
    		"source": "mapsource",
    		"minzoom": 0,
    		"maxzoom": 18
    
    					},{
    
    		"id": "annotationsource",
    		"type": "raster",
    		"source": "annotationsource",
    		"minzoom": 0,
    		"maxzoom":18
    			}]
    	}
    

    类似于高德、百度的地图,网上搜到这些地图的切片地址,同样也能够进行访问,需要注意的是,切片图层要做成web mecator的坐标系,才能进行访问。

    更多文章请关注公众号查看!
    在这里插入图片描述

    展开全文
  • 1.底图数据的来源 1.1.官方地图 主要是天地图、百度地图和高德地图等几个主流地图平台。...比如:在GIS应用支撑平台SDK中,就有直接使用天地图、高德底图、百度底图作为底图使用的例子。 高德影像图 百...

    1.底图数据的来源

    1.1.官方地图

    主要是天地图、百度地图和高德地图等几个主流地图平台。可以直接调用地图切片服务(即URL地址),也可以通过太乐地图下载互联网(如:百度地图、天地图和高德地图等)离线包(具体操作过程参照SVN中相应文档)将其设置为地图底图。比如:在GIS应用支撑平台SDK中,就有直接使用天地图、高德底图、百度底图作为底图使用的例子。

     

    高德影像图

     

    百度自定义色彩图

     

    百度交通流量图

     

    天地图地形图

    项目中常见的数据来源:项目甲方协调当地国土局或地理信息中心的政务外网地图服务URL地址。具体操作步骤(以安徽省为例):百度安徽省的天地图,点击查看资源中心,点击申请服务,有些精度较高的加密文件可能需要项目甲方向国土局发函申请。

    服务地址

     

    1.2.实地外采

    通过测量工具等实地采集地理数据。整理采集的数据用于制作地图底图使用。如果使用全站仪进行采集数据,要求全站仪具有编码选项,传输数据时在电脑中的统一格式为点号、编码。如果将上述的数据使用到绘图中,需要进行格式转换,具体操作是使用 Visual Basic软件,对其进行整理,让其变为大众式格式。继而采用测绘软件CASS完成制图工作。

    全站仪

    1.3.航片卫片制作

    无人机或者卫星拍摄的图片。在GIS软件中进行裁剪切割等操作,制作成地图底图使用。

    航拍照片

     

    卫拍照片

    1.4.地图数据制作加工的过程

    GIS从业者一般使用ArcGIS和SuperMap制作加工地图数据。地图数据制作主要4D(DEM数字高程模型、DOM数字正射影像、DLG数字线化地图、DRG数字栅格地图)数据的采集整理。首先要对底图配准赋予坐标信息。紧接着才进行点线面要素的采集。点线面要素分别对应着点线面图层,要对图层进行属性设置及显示设置,制作出符合审美观的地图。以下以专题图制作为例讲述数据制作加工过程。

    1.4.1 步骤图

    ......后续详细内容请关注我的微信公众号

    展开全文
  • GIS制作地理底图/变化监测

    千次阅读 2014-02-27 11:03:37
    650) this.width=650;" src="http://img1.51cto.com/attachment/201210/211230478.jpg" border="0" alt="" />   650) this.width=650;" src="http://img1.51cto.com/attachment/201210/211250494.jpg" border="0"

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,920
精华内容 1,968
关键字:

gis底图