zoukankan      html  css  js  c++  java
  • 一个GISER 6.7的祝福

    概述:

    一年一度的高考今天开始了,回想10年前,那是我第一次高考;10年后,作为一个GISER,在此给大家献上一个GISER的祝福,祝愿各位考生:考神附体,考完报考GIS专业(LZUの,给自己的母校打个广告)……


    内容:

    1、爬取全国的高校的数据;

    2、根据天地图的接口,获取高校的经纬度;

    3、将数据制作成shp,并转换为geojson;

    4、制作全国高校WEBGIS展示图。


    效果:


    爬取数据,保存为txt


    将txt用Excel打开并另存为


    在Arcmap中转换为shp


    将shp转换为geojson


    WEBGIS中展示

    实现:

    1、获取高校数据

    	public JSONObject getUrlContent(String url) throws IOException, JSONException{
    		JSONObject json = null;
    		InputStream is = null;
    		try {
    			is = new URL(url).openStream();
    			BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
    		    StringBuilder sb = new StringBuilder();
    		    int cp;
    		    while ((cp = rd.read()) != -1) {
    		        sb.append((char) cp);
    		    }
    		    String strJson = sb.toString().substring(7,sb.toString().length()-2);
    		    json = new JSONObject(strJson);
    		    is.close();
    		} 
    		catch (IOException e) {
    			e.printStackTrace();
    		}
    		return json;
    	}
    	public String[] getLonLatByName(String name){
    		String[] lonlat = new String[]{"99","99"};
    		String url = "http://api.tianditu.com/apiserver/ajaxproxy?proxyReqUrl=http://map.tianditu.com/query.shtml?postStr={'keyWord':'"+name+"','level':'3','mapBound':'29.88281,-23.56399,170.50781,53.54031','queryType':'7','start':'0','count':'1'}&type=query";
    		InputStream is = null;
    		try {
    			is = new URL(url).openStream();
    			BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
    		    StringBuilder sb = new StringBuilder();
    		    int cp;
    		    while ((cp = rd.read()) != -1) {
    			    sb.append((char) cp);
    			}
    			String strJson = sb.toString().substring(19,sb.toString().length()-1);
    		    JSONObject json = new JSONObject(strJson);
    		    JSONArray arr = new JSONArray();
    		    if(!json.isNull("pois")){
    		    	arr = json.getJSONArray("pois");
    		    	JSONObject poiinfo = (JSONObject) arr.get(0);
    			    lonlat = poiinfo.get("lonlat").toString().split(" ");
    			    is.close();
    		    }
    		}
    		catch (IOException | JSONException e) {
    	    	e.printStackTrace();
    	    }
    	    return lonlat;
    	}

    2、用GDAL实现shp转geojson

    # -*- coding: utf-8 -*-
    import sys
    from osgeo import gdal
    from osgeo import ogr
    
    #读取shap文件
    def shp2json():
        #为了支持中文路径,请添加下面这句代码 
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")  
        #为了使属性表字段支持中文,请添加下面这句
        gdal.SetConfigOption("SHAPE_ENCODING","")  
        #注册所有的驱动 
        ogr.RegisterAll()  
        #数据格式的驱动
        driver = ogr.GetDriverByName('ESRI Shapefile')
        ds = driver.Open(r'D:datagdaluniversity.shp');
        if ds is None:
            print "打开文件失败!"
            sys.exit(1)
        dv = ogr.GetDriverByName("GeoJSON")
        if dv is None:
            print "打开驱动失败!"
            sys.exit(1)
        dv.CopyDataSource(ds, r"D:datagdaluniversity.geojson")
        ds.Destroy()
        print "转换成功!"
    
    def main():
        shp2json();
        
    if __name__ == "__main__":
        main();

    3、展示数据

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<title>百度样式地图</title>
    	<link rel="stylesheet" href="https://openlayers.org/en/v4.1.1/css/ol.css" type="text/css">
    	<style type="text/css">
    		body, #map {
    			border: 0px;
    			margin: 0px;
    			padding: 0px;
    			 100%;
    			height: 100%;
    			font-size: 13px;
    			overflow: hidden;
    		}
    		#map{ 
    			background: url("../../images/bgImg.gif");
    			background-repeat: inherit;
    		}
    	</style>
    	<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
        <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
        <script src="https://openlayers.org/en/v4.1.1/build/ol.js"></script>
        <script type="text/javascript" src="../../../../plugin/jquery/jquery-1.8.3.js"></script>
    	<script type="text/javascript">
    		function init(){
    		    var projection = ol.proj.get("EPSG:3857");
    		    var resolutions = [];
    		    for(var i=0; i<19; i++){
    		        resolutions[i] = Math.pow(2, 18-i);
    		    }
    		    var tilegrid  = new ol.tilegrid.TileGrid({
    		        origin: [0,0],
    		        resolutions: resolutions
    		    });
    		    
    		    function getBaiduCustomimage(customid){
    		    	var baidu_source = new ol.source.TileImage({
    			        projection: projection,
    			        tileGrid: tilegrid,
    			        tileUrlFunction: function(tileCoord, pixelRatio, proj){
    			            if(!tileCoord){
    			                return "";
    			            }
    			            var z = tileCoord[0];
    			            var x = tileCoord[1];
    			            var y = tileCoord[2];
    			
    			            if(x<0){
    			                x = "M"+(-x);
    			            }
    			            if(y<0){
    			                y = "M"+(-y);
    			            }
    			            return "http://api2.map.bdimg.com/customimage/tile?&x="+x+
    			            	"&y="+y+"&z="+z+
    			            	"&udt=20170428&scale=1&ak=E4805d16520de693a3fe707cdc962045&customid="+customid;
    			        }
    			    });
    			    return new ol.layer.Tile({
    			        source: baidu_source
    			    });
    		    }
    			/**
    			 * 默认地图样式(normal)
    			 * 清新蓝风格(light)
    			 * 黑夜风格(dark)
    			 * 红色警戒风格(redalert)
    			 * 精简风格(googlelite)
    			 * 自然绿风格(grassgreen)
    			 * 午夜蓝风格(midnight)
    			 * 浪漫粉风格(pink)
    			 * 青春绿风格(darkgreen)
    			 * 清新蓝绿风格(bluish)
    			 * 高端灰风格(grayscale)
    			 * 强边界风格(hardedge)
    			 */
    		    var baidu_layer = getBaiduCustomimage("midnight");
    			var province = new ol.layer.Image({
    		        source: new ol.source.ImageWMS({
    			          ratio: 1,
    			          url: 'http://10.16.48.185:8086/geoserver/bj_grid/wms',
    			          params: {
    			          		'FORMAT': 'image/png',
    			                'VERSION': '1.1.1',
    			                STYLES: '',
    			                LAYERS: 'bj_grid:province_line',
    			          }
    		        })
    		    });
    		    $.get("../data/university.geojson",null,function(result){
    					result = eval("("+result+")");
    				    var features = (new ol.format.GeoJSON()).readFeatures(result);
    				    for(var i=0;i<features.length;i++){
    				    	var _feature = features[i];
    				    	var _geom = features[i].getGeometry();
    						_geom.transform('EPSG:4326', 'EPSG:3857');
    				    	_feature.setGeometry(_geom);
    				    }
    				    var vectorSource = new ol.source.Vector({
    				        features: features
    				    });
    					var vector = new ol.layer.Vector({
    						source: vectorSource,
    						style: new ol.style.Style({
    				          image: new ol.style.Circle({
    						        radius: 3,
    						        fill: new ol.style.Fill({
    									color: "rgba(0,255,255,0.5)"
    								})
    						    })
    				        })
    					});
    					var map = new ol.Map({
    				        target: 'map',
    				        layers: [baidu_layer, province, vector],
    				        view: new ol.View({
    				            center: ol.proj.transform([104.214, 35.847], 'EPSG:4326', 'EPSG:3857'),
    				            zoom: 4
    				        })
    				    });
    				});
    	   }
    	</script>
    </head>
    <body onLoad="init()">
    <div id="map">
    </div>
    </body>
    </html>

    ---------------------------------------------------------------------------------------------------------------

    技术博客

    CSDN:http://blog.csdn.NET/gisshixisheng

    博客园:http://www.cnblogs.com/lzugis/

    在线教程

    http://edu.csdn.Net/course/detail/799

    Github

    https://github.com/lzugis/

    联系方式

    q       q:1004740957

    e-mail:niujp08@qq.com

    公众号:lzugis15

    Q Q 群:452117357(webgis)

                 337469080(Android)

  • 相关阅读:
    [原创]可动态显示圆形图像或圆形文字的AvatarImageView
    [原创]自定义view之:快速开发一款Material Design风格的dialog的开源项目MDDialog
    [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式
    [原创]android自定义动画的一点感悟
    [原创]Java中的字符串比较,按照使用习惯进行比较
    [原创]android使用代码生成LayerDrawable的方法和注意事项
    [原创]android开源项目源码解析(一)----CircleImageView的源码解析
    [原创]自定义公历农历日期选择器
    自定义android RadioButton View,添加较为灵活的布局处理方式
    实现仿知乎的开场动画,图片zoomin的效果,实现原理,没加动效
  • 原文地址:https://www.cnblogs.com/lzugis/p/7224357.html
Copyright © 2011-2022 走看看