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

时间:2019-02-26 23:36:59

标签: r gis spatial shapefile sp

我无法找到多边形和空间点之间的距离。我正在尝试测量区域(多边形)和以前的锡矿(空间点)之间的距离。我怀疑我的投影可能做错了。我似乎能够计算出区域之间的距离,但不能计算区域和矿山之间的距离。

class FooBinder : ItemBinder<Foo, FooBinder.ViewHolder>() {

        @Inject
        protected lateinit var requestFavoriteUseCase: SendFooFavoriteUseCase

        @Inject
        protected lateinit var compositeDisposable: CompositeDisposable

        @Inject
        protected lateinit var retrieveFooFavoriteCountUseCase: RetrieveFooFavoriteCountUseCase

        override fun create(inflater: LayoutInflater, parent: ViewGroup) =
            ViewHolder(inflater.inflate(R.layout.item_foo_content, parent, false))

        override fun bind(holder: ViewHolder, item: Foo) {
            holder.itemView.foo_content_creator.text = with(item.creator) { "$firstName $lastName" }

            GlideApp.with(holder.itemView)
                .load(item.creator.avatar)
                .dontAnimate()
                .placeholder(R.drawable.ic_action_person)
                .error(R.drawable.ic_action_person)
                .into(holder.itemView.foo_content_profile)

            retrieveFooFavoriteCountUseCase
                    .execute(item.id)
                    .applyComputationScheduler()
                    .subscribe { count ->
                        holder.itemView.foo_content_like_count.text = "$count"
                    }
                    .addTo(compositeDisposable)
        }

        inner class ViewHolder(view: View) : ViewHolder<Foo>(view) {

            private var favorite = false

            init {

                view
                    .foo_content_button_layout
                    .clicks()
                    .flatMap {
                        favorite = !favorite
                        requestFavoriteUseCase.execute(FavoriteVM(item.id, favorite)).toObservable()
                    }
                    .subscribe {
                        view.foo_content_like_count.text = it.toString()

                        var res = R.drawable.ic_action_like_default
                        if (favorite) {
                            res = R.drawable.ic_action_like_enabled
                        }
                        view.foo_content_like_icon.setImageResource(res)
                    }
                    .addTo(compositeDisposable)
            }

        }

    }

我关于多边形之间距离的输出似乎是正确的:

#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)

但是我关于地区与矿山之间距离的输出肯定是错误的:

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

我打算做的是: 1)计算马来西亚所有地区与所有以前的锡矿之间的距离;和 2)提取最近的锡矿到每个地区的距离。

这是我正在使用的数据的link。我正在使用地区多边形的GADM数据,并且亲自亲自编码了历史性锡矿的位置。将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

您当前的方法有两个问题。 1.)coordinates分配不太正确。它应该是long / lat,但是您将其分配为lat / long。 2.)以当前方式直接设置CRS并不会实际上以必要的方式更改点。您需要首先分配适当的长/时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