calculating minimum distance between a point and the coast in the UK

后端 未结 1 1034
刺人心
刺人心 2021-02-10 17:48

I have been following the example shown here, but for the UK. For this reason I am using the CRS for the UK of EPSG:27700, which has the following projection string:

<         


        
1条回答
  •  野的像风
    2021-02-10 18:18

    AFAICT you are not doing anything wrong. The error message is telling you that some of the coordinates in the global coastline shapefile map to Inf. I'm not sure why this is happening exactly, but generally expecting a planar projection in a specific region to work globally is not a good idea (although it did work in the other question...). One workaround is to clip the coastline shapefile to the bounding box for your specific projection, then transform the clipped shapefile. The bounding box for EPSG.27700 can be found here.

    # use bounding box for epsg.27700
    # found here: http://spatialreference.org/ref/epsg/osgb-1936-british-national-grid/
    bbx <- readWKT("POLYGON((-7.5600 49.9600, 1.7800 49.9600, 1.7800 60.8400, -7.5600 60.8400, -7.5600 49.9600))",
                   p4s=CRS(wgs.84)) 
    coast <- gIntersection(coast,bbx)  # just coastlines within bbx
    # now transformation works
    coast.proj   <- spTransform(coast,CRS(epsg.27700))
    MAD.proj     <- spTransform(MAD,CRS(epsg.27700))
    dist.27700   <- gDistance(MAD.proj,coast.proj)   # distance in sq.meters
    dist.27700
    # [1] 32153.23
    

    So the closest coastline is 32.2 km away. We can also identify where on the coast this is

    # identify the closest point
    th     <- seq(0,2*pi,len=1000)
    circle <- cbind(1.00001*dist.wgs84*cos(th)+MAD$x,1.00001*dist.wgs84*sin(th)+MAD$y)
    sp.circle <- SpatialLines(list(Lines(list(Line(circle)),ID="1")),proj4string=CRS(wgs.84))
    sp.pts <- gIntersection(sp.circle,coast)
    sp.pts
    # SpatialPoints:
    #            x        y
    # 1 -0.2019854 50.83079
    # 1 -0.1997009 50.83064
    # Coordinate Reference System (CRS) arguments: +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
    

    And finally we can plot the results. You should always do this.

    # plot the results: plot is in CRS(wgs.84)
    plot(coast, asp=1)
    plot(bbx,add=T)
    plot(MAD,add=T, col="red", pch=20)
    plot(sp.circle,add=T, col="blue", lty=2)
    lines(c(MAD$x,sp.pts$x),c(MAD$y,sp.pts$y),col="red")
    

    0 讨论(0)
提交回复
热议问题