【WebGIS】leaflet入门-使用GeoJSON

介绍

GeoJSON是一种非常流行的地理数据存储格式,他以轻量级、便于传播而流行。相比较动则数个文件的shapefile文件,geojson轻便太多了(当然shapefile文件的很多功能是GeoJSON)不能比的。
在leaflet中,对GeoJSON也有着非常好的适配,我们可以直接解析GeoJSON格式的地理数据,这为我们的开发提供了很大的遍历,所以这一部分是非常重要的。
这里再次提供官方的文档和GeoJSON的官方定义文档
leaflet官方:leaflet.geoJSON
GeoJSON定义:GeoJSON

GeoJSON数据

那么GeoJSON数据到底是什么样的呢?相比大家对json数据有所了解,是由大括号、中括号和键值对所组成的一种数据格式,GeoJSON当然也不例外,下面现来举个例子

{
    "type": "Feature",
    "properties": {
        "name": "Coors Field",
        "amenity": "Baseball Stadium",
        "popupContent": "This is where the Rockies play!"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [-104.99404, 39.75621]
    }
};

这就是一个Feature类型的GeoJSON数据,包括了她的类型(type)、属性(properties)和几何形状(geometry)再细分下去,逐渐组成一个Feature,拥有这些数据,就可以解析并得到一个拥有属性和几何形状的Feature了。
更多的GeoJSON的数据类型这里就不再赘述,大家可以自行搜索或者查阅上面提供的GeoJSON的官方定义文档。

L.geoJSON的应用

leaflet支持GeoJSON的所有格式,但是对Feature和FeatureCollections的兼容性是最好的。如果你还不知道这俩是什么,那也没有关系。Feature的结构上面已经展示了,是一个包括属性和几何的要素。FeatureCollections呢,就是一个包含多个要素的要素集。

L.geoJSON提供了直接解析这种数据结构的功能,我们先尝试将上面的Feature展示在地图上。

var geojsonFeature={
    "type": "Feature",
    "properties": {
        "name": "Coors Field",
        "amenity": "Baseball Stadium",
        "popupContent": "This is where the Rockies play!"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [-104.99404, 39.75621]
    }
};

L.geoJSON(geojsonFeature).addTo(map)	

效果图如下
pointFeature
当你没有为点要素指定一个marker样式的时候,就会使用这个默认的样式了。

我们还可以以Array的形式来添加GeoJSON数据,比如下面

var myLines = [{
    "type": "LineString",
    "coordinates": [[-100, 40], [-105, 45], [-110, 55]]
}, {
    "type": "LineString",
    "coordinates": [[-105, 40], [-110, 45], [-115, 55]]
}];

L.geoJSON(myLines).addTo(map)

效果图如下
LineString
这其实不难理解,毕竟中括号也属于Json数据的一部分。
除此之外,你还可以创建一个geoJSON的空图层,然后再在后面添加GeoJSON格式的数据进去

var myLayer=L.geoJSON().addTo(map)
myLayer.addData(geojsonFeature)

或许你已经发现了GeoJSON数据只是定义了地理数据的基本信息(属性或者几何)但是并没有她的样式信息,所以你再加载一个GeoJSON数据时,leaflet会使用一个默认的样式将其渲染到地图上。若是想要自定义图像的样式,就需要用到geoJSON的一个选项:style

var style={
	"color":"#ff7800,
	"weight":5,
	"opcacity":0.65
}

L.geoJSON(myLine,{style:style})

我们还可以通过要素的属性来筛选定义不同属性的要素赋予给不同的样式

var states = [
            {
                "type": "Feature",
                "properties": { "party": "Republican" },
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [[
                        [-104.05, 48.99],
                        [-97.22, 48.98],
                        [-96.58, 45.94],
                        [-104.03, 45.94],
                        [-104.05, 48.99]
                    ]]
                }
            },
            {
                "type": "Feature",
                "properties": { "party": "Democrat" },
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [[
                        [-109.05, 41.00],
                        [-102.06, 40.99],
                        [-102.03, 36.99],
                        [-109.04, 36.99],
                        [-109.05, 41.00]
                    ]]
                }
            }
        ]

        L.geoJSON(states,{
            style:function(feature){
                switch(feature.properties.party){
                    case "Republican":return{color:"#ff0000"};
                    case "Democrat":return{color:"#0000ff"};
                }
            }
        }).addTo(map)

pointToLayer

点要素是和线要素和面要素不一样的要素,我们可以通过pointToLayer这个函数来对点要素的样式进行定义

 var geojsonMarkerOptions = {
     radius: 8,
     fillColor: "#ff7800",
     color: "#000",
     weight: 1,
     opacity: 1,
     fillOpacity: 0.8
 };
L.geoJSON(geojsonFeature, {
    pointToLayer: function (feature, latlng) {
        return L.circleMarker(latlng, geojsonMarkerOptions)
    }
}).addTo(map)

效果如下:
pointToLayer
这样就可以为point要素定义一些marker的样式

onEachFeature

onEachFeatue函数可以让我们遍历要素集中的所有要素,并且为所有要素赋予一些属性或进行一些操作

//为所有要素添加popup为他们自身的属性
 function onEachFeature(feature, layer) {
     // does this feature have a property named popupContent?
     if (feature.properties && feature.properties.popupContent) {
         layer.bindPopup(feature.properties.popupContent);
     }
 }
 //添加geoJSON图层到地图上
L.geoJSON(geojsonFeature,{
   onEachFeature:onEachFeature
}).addTo(map)

效果如下:
onEachFeature

fliter

fliter可以让我们筛选要素,选择特定的要素才显示在地图上

var someFeatures = [{
    "type": "Feature",
    "properties": {
        "name": "Coors Field",
        "show_on_map": true
    },
    "geometry": {
        "type": "Point",
        "coordinates": [-104.99404, 39.75621]
    }
}, {
    "type": "Feature",
    "properties": {
        "name": "Busch Field",
        "show_on_map": false
    },
    "geometry": {
        "type": "Point",
        "coordinates": [-104.98404, 39.74621]
    }
}];

L.geoJSON(someFeatures,{
    fliter:function(feature,layer){
        return feature.properties.show_on_map;
    }
}).addTo(map)

这里只有show_on_map属性为true的要素才能显示在地图上

结语

本文介绍了geoJSON在leaflet中的使用方式,我们可以给geoJSON加载的要素通过各种方法添加样式和方法。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebGISLeaflet全面解析》是一本针对WebGIS开发中的Leaflet库进行详细解析的PDF教程。本书内容丰富全面,适合WebGIS初学者或有一定基础的开发者学习。 首先,本书首先介绍了WebGIS的基本概念和发展趋势,让读者对WebGIS有一个整体的认识。然后,重点介绍了Leaflet库的基本知识和使用方法。Leaflet是一个轻量级的JavaScript库,用于在Web浏览器中创建地图和交互式地图应用程序。 在Leaflet的基础知识介绍之后,本书详细讲解了Leaflet库的各种功能和插件。包括地图的创建与配置、图层的添加与控制、交互操作的实现、地图样式的定制等方面。同时,本书还扩展了Leaflet库的功能,介绍了如何在Leaflet中集成常见的地理信息数据格式,如GeoJSON、WMS等。还介绍了如何使用Leaflet与其他常见的WebGIS框架和工具进行集成开发,如OpenLayers、ArcGIS API for JavaScript等。 除了技术介绍外,本书还包含了丰富的实例和案例,帮助读者快速上手并深入理解Leaflet库的使用和应用场景。通过实例的讲解,读者可以学习如何使用Leaflet开发各种功能丰富的WebGIS应用程序,如地图展示、地理信息查询、路径规划、地理数据可视化等。 总之,《WebGISLeaflet全面解析》是一本内容详实、实用性强的教程,通过学习本书,读者可以全面掌握Leaflet库的使用方法和开发技巧,有助于提升WebGIS应用程序的开发水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值