使用传单绘制非洲冲突

嘿,

今天,我决定做一个更高级的Leaflet turorial:

我们将使用csv格式的数据通过R生成geojson文件,最后使用Leaflet创建网络地图。

如果您不想使用R,只需跳过第一部分,然后直接跳到Leaflet部分。您可以在下面下载生成的geoJson文件。

首先让我们获取数据:

 

下载:

我们将使用ACLED数据,它代表:

ACLED(武装冲突定位和事件数据项目)旨在进行分类的冲突分析和危机映射。该数据集对50多个发展中国家中所有报告的政治暴力事件的日期和位置进行了编码。 (http://www.acleddata.com)

要下载与本教程中使用的数据集相同的数据集,请转到网页并下载 实时数据(2015) 作为.csv。

当您在Excel中打开数据时,它的数据集比较混乱,因此,我们将在R中构建geojson文件:

 CSV _conflicts

 

使用R将CSV转换为geoJson:

这实际上很简单,只需几行代码即可完成。您需要的是rgdal软件包,一些小的数据转换和功能 SpatialPointsDataFrame() writeOGR() .

 

#get  格达尔  package
install.packages(" 格达尔 ")
library(rgdal)

#read .csv file
conflicts <- read.csv("ACLED All Africa File_20150101 to 20150207.csv")

#first convert the LAT/LONG COL to character  和  then to numeric
conflicts$LATITUDE  <- as.character(conflicts$LATITUDE)
conflicts$LONGITUDE  <- as.character(conflicts$LONGITUDE)
conflicts$LATITUDE  <- as.numeric(conflicts$LATITUDE)
conflicts$LONGITUDE  <- as.numeric(conflicts$LONGITUDE)

#delete NA values
conflicts <- na.omit(conflicts)

#create a geoJson
conflicts <- SpatialPointsDataFrame(conflicts[,c(20,19)],conflicts[,-c(20,19)])

writeOGR(conflicts, 'conflicts.geojson','conflicts', driver='GeoJSON')

开始映射:

 

准备传单文件:

创建geoJson文件后,将其打开并在第一行中编写以下JavaScript代码:

var conflicts =

然后放置一个 分号 在geoJson文件的最后!

该文件现在应如下所示:

flicts_geojson

您可以下载最终的geoJson文件 这里。

 

在以下位置包含库/扩展名和geoJsonfile<head>:

现在,在网络编辑器中打开一个新的html文件,然后编辑<head> as following:

<head>
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script src="leaflet-providers.js"></script>
<script src="conflicts.geojson"></script>
</head>

第一行包括您的网页中的传单库,第二行包括您可以下载的Leaflet-Providers扩展 这里。 您还可以从以下网站获取有关Leaflet-Provides Extension的更多信息 上一教程.

第三行代码包含我们刚刚在您的网页中创建的geojson文件。

 

创建地图:

首先是一些HTML和CSS:<body>标签创建一个空的<div>地图的容器:

<div id="map"></div>
<style>  
#map { height: 500px; }  
</style>

 

最后的传单:

这是我使用的最终JavaScript代码:

 <script>     
   
 //Set the view coordinates of the map  和  the zoom:
 var map = L.map('map').setView([40.18, 18.37], 2); 
      
 //Use "CartoDB.DarkMatter" as TileLayer provider
 L.tileLayer.provider('CartoDB.DarkMatter').addTo(map);
       
      //add the geoJson File to the map  和  style it:
        geojson  = L.geoJson(conflicts, {    
           
            //this makes circles out of the standard leaflet marker pins
            pointToLayer: function(feature, latlng) {               
                return new L.CircleMarker(latlng, {
                    radius: 5,
                    fillColor: "red",
                    color: "#000",
                    weight: 1,
                    opacity: 1,
                    fillOpacity: 0.4
                });
            },

           //bind a Pop-Up Window on each Circle to display some information from the geoJson File
           onEachFeature: function (feature, layer) {
                layer.bindPopup("<b>Event Type: </b>" + feature.properties.EVENT_TYPE + "<br>" +
                                "<b>Country: </b>" + feature.properties.COUNTRY + "<br>" +
                                "<b>Location: </b>" + feature.properties.LOCATION + "<br>" +
                                "<b>Details: </b>" + feature.properties.NOTES);     
    }}
        ).addTo(map);
</script>     

您可以在线查看最终结果 这里 .

我希望该示例向您展示了对数据进行分级,使用R将其转换为可读格式并使用它来创建精美的传单地图的过程是多么快速和简单。

如果您对代码有任何疑问,请在注释中给我一行。

干杯

马丁

 

关于作者

马丁出生于捷克共和国,就读于维也纳自然资源与生命科学大学。他目前在GeoVille(一家位于奥地利的地球观测公司)工作,专门从事土地监测。他的主要兴趣是:开源应用程序,例如R,(地理空间)统计和数据管理,Web映射和可视化。他喜欢旅行,寻宝,摄影和运动。

1条评论

您可以在这篇文章中发表评论。


  • 嗨,您能为我提供使用Leaflet映射非洲冲突的示例代码吗?谢谢

    问候

    罗伊

    罗伊 5年前 回复


发表回复

*