简体   繁体   English

计算从多边形到空间点的最小距离

[英]Calculate minimum distance from polygon to spatial point

I am having trouble finding the distance between polygons and spatial points. 我无法找到多边形和空间点之间的距离。 I am trying to measure the distance between districts (polygons) and former tin mines (spatial points). 我正在尝试测量区域(多边形)和以前的锡矿(空间点)之间的距离。 I suspect I may have done something wrong with the projection. 我怀疑我的投影可能做错了。 I seem to be able to calculate the distance between the districts, but not for districts and mines. 我似乎能够计算出区域之间的距离,但不能计算区域和矿山之间的距离。

#Open file
mapping<- readOGR(dsn="C:/Users/noble/OneDrive - London School of Economics/LSE/EC465/Extended Essay/Stack Exchange Question/gadm2.Peninsula.dbf")


#Define the districts
Kinta <- mapping[mapping@data$NAME_1 == "Perak" &
             mapping@data$NAME_2 == "Kinta", ]
Gombak <- mapping[mapping@data$NAME_1 == "Selangor" &
             mapping@data$NAME_2 == "Gombak", ]

#Set a projection
EPSG.3375<-"+proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257964666666 +k=0.99984 +x_0=804671 +y_0=0 +ellps=GRS80 +units=m +no_defs"
Gombak.km<-spTransform(Gombak,CRS(EPSG.3375))
Kinta.km<-spTransform(Kinta,CRS(EPSG.3375))

#Calculate the distance
gDistance(Kinta.km, Gombak.km, byid=TRUE)

#Open data on tin mines and define as spatial points
tin.01<-read.csv("C:/Users/noble/OneDrive - London School of Economics/LSE/EC465/Extended Essay/Stack Exchange Question/Tin Mine Location_01.csv")
coordinates(tin.01)<-8:9

proj4string(tin.01) <- CRS("+proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257964666666 +k=0.99984 +x_0=804671 +y_0=0 +ellps=GRS80 +units=m +no_defs")

#Find distance between district and mines
gDistance(Kinta.km,tin.01,byid=TRUE)

My output for the distance between polygons appear to be correct: 我关于多边形之间距离的输出似乎是正确的:

> gDistance(Kinta.km, Gombak.km, byid=TRUE)
   59
71 100676

But my output for distance between the districts and mines are definitely wrong: 但是我关于地区和地雷之间的距离的输出肯定是错误的:

> gDistance(Kinta.km,tin.01,byid=TRUE)
    59
1 661153.5
2 661152.6
3 661153.0
4 661152.7
5 661151.8
6 661152.9
7 661153.1
8 661153.3
9 661153.2

What I intend to do is to: 1) calculate the distance between all districts in Malaysia with all the former tin mines; 我打算做的是:1)计算马来西亚所有地区与所有以前的锡矿之间的距离; and 2) extract the distance of the closest tin mine to each district. 2)提取最近的锡矿到每个地区的距离。

Here's a link to the data I'm using. 这是我正在使用的数据的链接 I'm using GADM data for the district polygons and I've hand coded the location of historical tin mines myself. 我正在使用地区多边形的GADM数据,并且亲自亲自编码了历史性锡矿的位置。 Would appreciate all help given. 将不胜感激。 Thank you. 谢谢。

There are two issues with your current approach. 当前的方法有两个问题。 1.) The coordinates assignment isn't quite correct. 1.) coordinates分配不太正确。 It should be long/lat, but you're assigning it as lat/long. 它应该是long / lat,但是您将其分配为lat / long。 2.) Directly setting the CRS in the current way will not actually alter the points in the necessary way. 2.)以当前方式直接设置CRS并不会实际上以必要的方式更改点。 You need to assign an appropriate long/lat CRS first, and then perform a spTransform action. 您需要首先分配适当的长/纬度CRS,然后执行spTransform操作。

#Open data on tin mines and define as spatial points
tin.01 <- read.csv("random/Tin Mine Location_01.csv")
coordinates(tin.01) <- c("Longitude","Latitude")  ## Should be `9:8` if you wanted to stick with indexes, but using the names here is generally lower risk.
proj4string(tin.01) <- CRS(proj4string(Kinta)) ## Setting the initial projection to the same one the polygons are using. You should change this if your original data source uses some other known long/lat projection.

tin.km <- spTransform(tin.01,CRS(EPSG.3375)) ## Creating a transformed set of points for the distance calculation.

#Find distance between district and mines
gDistance(Kinta.km,tin.km,byid=TRUE) ## '0' distance means the mine is inside the district.

          59
1 194384.372
2 223773.999
3      0.000
4  36649.914
5 102944.361
6      0.000
7      0.000
8   6246.066
9      0.000

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM