已知某个地点的经纬度,如何判断其是在北方还是南方?

最近有个小伙伴问了这样一个问题:

已知某个地点的经纬度,如何判断其是在北方还是南方呢?

在 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 经度 lon
ren 纬度 lat
cap destring lon lat, replace force
drop 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

*> +--------------------------------------------+
*> | id region lon lat |
*> |--------------------------------------------|
*> 1. | 13519 秦岭淮河以南 121.4765 31.23391 |
*> 2. | 13520 秦岭淮河以南 121.4812 31.21631 |
*> 3. | 13521 秦岭淮河以南 121.4333 31.20107 |
*> 4. | 13522 秦岭淮河以南 121.4333 31.20107 |
*> 5. | 13523 秦岭淮河以南 121.4247 31.18644 |
*> |--------------------------------------------|
*> 6. | 13524 秦岭淮河以南 121.409 31.16892 |
*> 7. | 13525 秦岭淮河以南 121.4481 31.11046 |
*> 8. | 13526 秦岭淮河以南 121.4345 31.11449 |
*> 9. | 13527 秦岭淮河以南 121.42 31.22222 |
*> 10. | 13528 秦岭淮河以南 121.42 31.22222 |
*> +--------------------------------------------+

为了节省上传和下载的时间,大家可以对上传的 csv 文件仅仅保留 id、lon 和 lat 变量,然后下载得到的 csv 文件就可以使用 id 变量再和原始数据匹配了。

如果要转换的经纬度数据较多,可以拆分成多个文件逐次处理。

点击这里跳转到 RStata 短书平台获取附件:已知某个地点的经纬度,如何判断其是在北方还是南方?

评论