最近有个小伙伴问了这样一个问题:
已知某个地点的经纬度,如何判断其是在北方还是南方呢?
在 R 语言中这个问题非常简单,之前我们也推出过课程讲解:如何判断工企业在南方还是北方 & 计算每个工企业距离秦岭淮河线的距离?(在平台上搜索即可找到)。
但是很多小伙伴还不会使用 R 语言,所以我们今天就来针对 Stata 用户讲解这个问题的解决方案。
大家都知道南北方实际上是个很模糊的概念,虽说是以秦岭-淮河为界,但是这个界太宽了,所以我们就选择一条看起来差不多的线:
使用 R 语言判断某个点是位于北方还是南方是个很简单的事情,例如 待转换.csv 文件是一些坐标点:
library( tidyverse) library( sf) read_csv( "待转换.csv" ) %>% mutate( lon = as.numeric ( lon) , lat = as.numeric ( lat) ) %>% st_as_sf( coords = c ( "lon" , "lat" ) , crs = 4326 ) %>% mutate( id = as.numeric ( row.names( .) ) ) -> dfn read_sf( "秦岭淮河以南.geojson" ) -> south read_sf( "秦岭淮河以北.geojson" ) -> north bind_rows( dfn %>% st_intersection( south) %>% mutate( lon = st_coordinates( geometry) [ , 1 ] , lat = st_coordinates( geometry) [ , 2 ] ) %>% st_drop_geometry( ) , dfn %>% st_intersection( north) %>% mutate( lon = st_coordinates( geometry) [ , 1 ] , lat = st_coordinates( geometry) [ , 2 ] ) %>% st_drop_geometry( ) )
为了让大家不使用 R 语言也能根据经纬度坐标判断南北方,我编写了一个 shiny 应用:northorsouth:
在线使用:https://czxb.shinyapps.io/northorsouth/
首先我们需要把需要处理的数据保存为 csv 文件并且把经度重命名为 lon,纬度重命名为 lat(两个变量都必须是数值型的,不能包含缺失值),例如 示例数据.dta:
cd "~/Desktop/已知某个地点的经纬度,如何判断其是在北方还是南方?/" use 示例数据, clear ren 经度 lonren 纬度 latcap destring lon lat, replace forcedrop if missing (lon) | missing (lat)export delimited using "待转换2.csv" , replace #> # A tibble: 34,441 × 4 #> id region lon lat #> <dbl> <chr> <dbl> <dbl> #> 1 506 秦岭淮河以南 115. 33.0 #> 2 507 秦岭淮河以南 115. 33.0 #> 3 508 秦岭淮河以南 115. 33.0 #> 4 509 秦岭淮河以南 115. 33.0 #> 5 510 秦岭淮河以南 115. 33.0 #> 6 511 秦岭淮河以南 115. 33.0 #> 7 512 秦岭淮河以南 115. 33.0 #> 8 513 秦岭淮河以南 115. 33.0 #> 9 514 秦岭淮河以南 115. 33.0 #> 10 515 秦岭淮河以南 115. 33.0 #> # … with 34,431 more rows
然后把处理得到的 待转换2.csv 文件上传到 northorsouth:
待预览结果出现后点击 Download 下载处理好的数据:
下载完成之后就可以得到一个 含南北方属性的数据.csv:
import delimited using 含南北方属性的数据.csv, clear list in 1/10
为了节省上传和下载的时间,大家可以对上传的 csv 文件仅仅保留 id、lon 和 lat 变量,然后下载得到的 csv 文件就可以使用 id 变量再和原始数据匹配了。
如果要转换的经纬度数据较多,可以拆分成多个文件逐次处理。
点击这里跳转到 RStata 短书平台获取附件:已知某个地点的经纬度,如何判断其是在北方还是南方?
评论