Hi ALL, I want to pick up cells values of a grid (say a RS image) using points' positions. For example, I have an image and a point shape file with the same coordinate system, then I try to overlay points on the image, and want to get the cell values of the on-point cell and 8 surrounding cells. Could any expert give some tips to solve my problem?
Regards Yong -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED] Sent: 2008年12月3日 22:00 To: r-sig-geo@stat.math.ethz.ch Subject: R-sig-Geo Digest, Vol 64, Issue 3 Send R-sig-Geo mailing list submissions to r-sig-geo@stat.math.ethz.ch To subscribe or unsubscribe via the World Wide Web, visit https://stat.ethz.ch/mailman/listinfo/r-sig-geo or, via email, send a message with subject or body 'help' to [EMAIL PROTECTED] You can reach the person managing the list at [EMAIL PROTECTED] When replying, please edit your Subject line so it is more specific than "Re: Contents of R-sig-Geo digest..." Today's Topics: 1. GSTAT: Optimize power value for IDW (Zev Ross) 2. Re: GSTAT: Optimize power value for IDW (Paul Hiemstra) 3. R: GSTAT: Optimize power value for IDW (Paul Hiemstra approach) (Alessandro) 4. Re: R: GSTAT: Optimize power value for IDW (Paul Hiemstra approach) (Zev Ross) 5. Re: R: GSTAT: Optimize power value for IDW (Paul Hiemstra approach) (Edzer Pebesma) 6. Raster file from ascii file and flattening Africa .... :) (Corrado) 7. Re: Raster file from ascii file and flattening Africa ....:) (Kamran Safi) ---------------------------------------------------------------------- Message: 1 Date: Tue, 02 Dec 2008 13:59:47 -0500 From: Zev Ross <[EMAIL PROTECTED]> Subject: [R-sig-Geo] GSTAT: Optimize power value for IDW To: r-sig-geo@stat.math.ethz.ch Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Hi All, ArcGIS has a nice little button that calculates the optimal power value to use for inverse distance weighting based on cross-validation and RMSPE. Just wondering if anyone had written something similar in R -- I'm using GSTAT and I'd like to avoid back and forth with ArcGIS (and obviously I'd like to avoid writing it myself as well!). Zev -- Zev Ross ZevRoss Spatial Analysis 120 N Aurora, Suite 3A Ithaca, NY 14850 607-277-0004 (phone) 866-877-3690 (fax, toll-free) [EMAIL PROTECTED] ------------------------------ Message: 2 Date: Tue, 02 Dec 2008 21:06:38 +0100 From: Paul Hiemstra <[EMAIL PROTECTED]> Subject: Re: [R-sig-Geo] GSTAT: Optimize power value for IDW To: Zev Ross <[EMAIL PROTECTED]> Cc: r-sig-geo@stat.math.ethz.ch Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Zev Ross schreef: > Hi All, > > ArcGIS has a nice little button that calculates the optimal power > value to use for inverse distance weighting based on cross-validation > and RMSPE. Just wondering if anyone had written something similar in R > -- I'm using GSTAT and I'd like to avoid back and forth with ArcGIS > (and obviously I'd like to avoid writing it myself as well!). > > Zev > Hi, I don't have any code lying around, but a brute force optimization approach should be quite easy. Also because the range of idw-powers is relatively small. The speed would ofcourse depend on the size of the dataset. In code it would look something like (actually works :)): library(gstat) data(meuse) coordinates(meuse) = ~x+y # make function to do the cv do_cv = function(idp) { meuse_idw = gstat(id = "zn", formula = zinc~1, data = meuse, set = list(idp = idp)) out = gstat.cv(meuse_idw) return(sqrt(mean(out$residual^2))) # RMSE as optimization criterium } idw_pow = seq(0.1,5, by = 0.2) # the idwpower values that will be checked cv_vals = sapply(idw_pow, do_cv) # calculate the rmse # List of outcomes print(data.frame(idp = idw_pow, cv_rmse = cv_vals)) After this you select the idw value with the smallest RMSE. cheers and hth, Paul -- Drs. Paul Hiemstra Department of Physical Geography Faculty of Geosciences University of Utrecht Heidelberglaan 2 P.O. Box 80.115 3508 TC Utrecht Phone: +31302535773 Fax: +31302531145 http://intamap.geo.uu.nl/~paul ------------------------------ Message: 3 Date: Tue, 2 Dec 2008 12:44:08 -0800 From: "Alessandro" <[EMAIL PROTECTED]> Subject: [R-sig-Geo] R: GSTAT: Optimize power value for IDW (Paul Hiemstra approach) To: "'Paul Hiemstra'" <[EMAIL PROTECTED]>, "'Zev Ross'" <[EMAIL PROTECTED]> Cc: r-sig-geo@stat.math.ethz.ch Message-ID: <[EMAIL PROTECTED]@unifi.it> Content-Type: text/plain; charset="iso-8859-1" Hi Normally I use the R+SAGA to calculate the IDW and create a raster, with this follow code. I change the radius input with a loop formula to create several raster and after check the best result (I am studying a oak forest with low density) radii.list <- as.list(c(5, 10, 15, 20, 25, 30)) for(i in 1:length(radii.list)){ rsaga.geoprocessor(lib="grid_gridding", module=0, param=list(GRID=set.file.extension(paste("DEM_iw",radii.list[[i]],sep=""),". sgrd"), SHAPES="ground.shp", FIELD=0, TARGET= 0, POWER=1.0, RADIUS=radii.list[[i]], NPOINTS=20, USER_CELL_SIZE=dem.pixelsize, [EMAIL PROTECTED],1], [EMAIL PROTECTED],2], [EMAIL PROTECTED],1], [EMAIL PROTECTED],2])) } After I have 6 raster (DEM_idw_5.sgrd, DEM_idw_10.sgrd, DEM_idw_15.sgrd, DEM_idw_20.sgrd, etc. etc.). I check hand-made the best IDW. I don't know is It possible to improve this formula with RMSE in gstat and calculate the best power. Ale -----Messaggio originale----- Da: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Per conto di Paul Hiemstra Inviato: marted? 2 dicembre 2008 12.07 A: Zev Ross Cc: r-sig-geo@stat.math.ethz.ch Oggetto: Re: [R-sig-Geo] GSTAT: Optimize power value for IDW Zev Ross schreef: > Hi All, > > ArcGIS has a nice little button that calculates the optimal power > value to use for inverse distance weighting based on cross-validation > and RMSPE. Just wondering if anyone had written something similar in R > -- I'm using GSTAT and I'd like to avoid back and forth with ArcGIS > (and obviously I'd like to avoid writing it myself as well!). > > Zev > Hi, I don't have any code lying around, but a brute force optimization approach should be quite easy. Also because the range of idw-powers is relatively small. The speed would ofcourse depend on the size of the dataset. In code it would look something like (actually works :)): library(gstat) data(meuse) coordinates(meuse) = ~x+y # make function to do the cv do_cv = function(idp) { meuse_idw = gstat(id = "zn", formula = zinc~1, data = meuse, set = list(idp = idp)) out = gstat.cv(meuse_idw) return(sqrt(mean(out$residual^2))) # RMSE as optimization criterium } idw_pow = seq(0.1,5, by = 0.2) # the idwpower values that will be checked cv_vals = sapply(idw_pow, do_cv) # calculate the rmse # List of outcomes print(data.frame(idp = idw_pow, cv_rmse = cv_vals)) After this you select the idw value with the smallest RMSE. cheers and hth, Paul -- Drs. Paul Hiemstra Department of Physical Geography Faculty of Geosciences University of Utrecht Heidelberglaan 2 P.O. Box 80.115 3508 TC Utrecht Phone: +31302535773 Fax: +31302531145 http://intamap.geo.uu.nl/~paul _______________________________________________ R-sig-Geo mailing list R-sig-Geo@stat.math.ethz.ch https://stat.ethz.ch/mailman/listinfo/r-sig-geo ------------------------------ Message: 4 Date: Tue, 02 Dec 2008 15:54:35 -0500 From: Zev Ross <[EMAIL PROTECTED]> Subject: Re: [R-sig-Geo] R: GSTAT: Optimize power value for IDW (Paul Hiemstra approach) To: Alessandro <[EMAIL PROTECTED]> Cc: r-sig-geo@stat.math.ethz.ch Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset="us-ascii" An HTML attachment was scrubbed... URL: <https://stat.ethz.ch/pipermail/r-sig-geo/attachments/20081202/1fcf93f3/attachment-0001.html> ------------------------------ Message: 5 Date: Tue, 02 Dec 2008 22:29:31 +0100 From: Edzer Pebesma <[EMAIL PROTECTED]> Subject: Re: [R-sig-Geo] R: GSTAT: Optimize power value for IDW (Paul Hiemstra approach) To: Zev Ross <[EMAIL PROTECTED]> Cc: r-sig-geo@stat.math.ethz.ch Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Hi Zev, There's no need to brute force, as optimize is there to help you -- my guess is that the function is convex. The following takes a while: > f = function(idp, formula, data,...) sum(krige.cv(formula,data,set=list(debug=0,idp=idp),...)$residual**2) > optimize(f, interval=c(0.01,4), formula=log(zinc)~1, data=meuse) $minimum [1] 3.532051 $objective [1] 32.09126 but that is probably due to the (my?) hopelessly inefficient (though flexible) setup of krige.cv. Speeding up can be done by allowing a larger tolerance, or passing e.g. nfold=5 to optimize(). This nfold will also result in somewhat random output, as it randomly folds the data in 5 partitions. -- Edzer Zev Ross wrote: > Hi All, > > Thanks to Paul and Alessandro for their suggestions. Paul's code > (brute force) worked well for me and the results match up well with > ArcGIS. I'm not using a large dataset so the speed isn't an issue but > with a larger dataset it would be. In ArcGIS the optimization is > instantaneous so clearly the software is doing something different > than testing out all possible values. > > I used Paul's code with no substantive changes then it's > straightforward to use: > > plot(idw_pow, cv_vals) > idw_pow[which.min(cv_vals)] > > And pull out the min. > > Thanks for the advice! Zev > > > > > Alessandro wrote: >> Hi >> >> Normally I use the R+SAGA to calculate the IDW and create a raster, with >> this follow code. I change the radius input with a loop formula to create >> several raster and after check the best result (I am studying a oak forest >> with low density) >> >> radii.list <- as.list(c(5, 10, 15, 20, 25, 30)) >> for(i in 1:length(radii.list)){ >> rsaga.geoprocessor(lib="grid_gridding", module=0, >> param=list(GRID=set.file.extension(paste("DEM_iw",radii.list[[i]],sep=""),". >> sgrd"), >> SHAPES="ground.shp", FIELD=0, TARGET= 0, POWER=1.0, >> RADIUS=radii.list[[i]], NPOINTS=20, USER_CELL_SIZE=dem.pixelsize, >> [EMAIL PROTECTED],1], [EMAIL PROTECTED],2], >> [EMAIL PROTECTED],1], [EMAIL PROTECTED],2])) >> } >> >> >> After I have 6 raster (DEM_idw_5.sgrd, DEM_idw_10.sgrd, DEM_idw_15.sgrd, >> DEM_idw_20.sgrd, etc. etc.). I check hand-made the best IDW. I don't know is >> It possible to improve this formula with RMSE in gstat and calculate the >> best power. >> >> Ale >> >> >> >> -----Messaggio originale----- >> Da: [EMAIL PROTECTED] >> [mailto:[EMAIL PROTECTED] Per conto di Paul Hiemstra >> Inviato: marted? 2 dicembre 2008 12.07 >> A: Zev Ross >> Cc: r-sig-geo@stat.math.ethz.ch >> Oggetto: Re: [R-sig-Geo] GSTAT: Optimize power value for IDW >> >> Zev Ross schreef: >> >>> Hi All, >>> >>> ArcGIS has a nice little button that calculates the optimal power >>> value to use for inverse distance weighting based on cross-validation >>> and RMSPE. Just wondering if anyone had written something similar in R >>> -- I'm using GSTAT and I'd like to avoid back and forth with ArcGIS >>> (and obviously I'd like to avoid writing it myself as well!). >>> >>> Zev >>> >>> >> Hi, >> >> I don't have any code lying around, but a brute force optimization >> approach should be quite easy. Also because the range of idw-powers is >> relatively small. The speed would ofcourse depend on the size of the >> dataset. In code it would look something like (actually works :)): >> >> library(gstat) >> data(meuse) >> coordinates(meuse) = ~x+y >> >> # make function to do the cv >> do_cv = function(idp) { >> meuse_idw = gstat(id = "zn", formula = zinc~1, data = meuse, set = >> list(idp = idp)) >> out = gstat.cv(meuse_idw) >> return(sqrt(mean(out$residual^2))) # RMSE as optimization criterium >> } >> >> idw_pow = seq(0.1,5, by = 0.2) # the idwpower values that will be checked >> cv_vals = sapply(idw_pow, do_cv) # calculate the rmse >> # List of outcomes >> print(data.frame(idp = idw_pow, cv_rmse = cv_vals)) >> >> After this you select the idw value with the smallest RMSE. >> >> cheers and hth, >> Paul >> >> > > -- > Zev Ross > ZevRoss Spatial Analysis > 120 N Aurora, Suite 3A > Ithaca, NY 14850 > 607-277-0004 (phone) > 866-877-3690 (fax, toll-free) > [EMAIL PROTECTED] > ------------------------------------------------------------------------ > > _______________________________________________ > R-sig-Geo mailing list > R-sig-Geo@stat.math.ethz.ch > https://stat.ethz.ch/mailman/listinfo/r-sig-geo > -- Edzer Pebesma Institute for Geoinformatics (ifgi), University of M?nster Weseler Stra?e 253, 48151 M?nster, Germany. Phone: +49 251 8333081, Fax: +49 251 8339763 http://ifgi.uni-muenster.de/ http://www.springer.com/978-0-387-78170-9 [EMAIL PROTECTED] ------------------------------ Message: 6 Date: Wed, 3 Dec 2008 09:29:29 +0000 From: Corrado <[EMAIL PROTECTED]> Subject: [R-sig-Geo] Raster file from ascii file and flattening Africa .... :) To: [EMAIL PROTECTED], r-sig-geo@stat.math.ethz.ch Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset="utf-8" Dear friends, I am a kind of advanced newbie, if that makes sense. I have a text file of the form coordinate x,coordinate y,cat={real number between 250 and 450} where coordinate are expressed in latitude and longitude. The files represents measurements of the size of a skulls on sites all over Africa. >From it, I would like to build a raster file, 100 km by 100km. There are 2 problems: 1) Unfortunately, in some 100km x 100km squares, there is one of the points whilst in others there are maybe 20. How do I average, so that in each square I only have 1 value representing the average? 2) How do we "flatten" Africa so that we may use 100km x 100km squares instead of 1 degree x 1 degree, without committing a geographical crime? What we need is to respect the areas .... Best regards and apologies for the silliness of the questions. -- Corrado Topi Global Climate Change & Biodiversity Indicators Area 18,Department of Biology University of York, York, YO10 5YW, UK Phone: + 44 (0) 1904 328645, E-mail: [EMAIL PROTECTED] ------------------------------ Message: 7 Date: Wed, 3 Dec 2008 10:26:14 -0000 From: "Kamran Safi" <[EMAIL PROTECTED]> Subject: Re: [R-sig-Geo] Raster file from ascii file and flattening Africa ....:) To: "Corrado" <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>, <r-sig-geo@stat.math.ethz.ch> Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset="us-ascii" Hi Corrado, Being a advanced newbie myself, I first of all understand what you mean by that and secondly ask you to qualify my answer. I would, tackling your problem, create a raster polygon in a metric equal area projection, such as Mollweide. Then you use overlay() and get for each polygon the set of points that are within each raster polygon. You need to import the xyz file in R and convert it into a Spatialpoints data frame. Here's the first bit This reads a coast line shapefile and extracts africa from it. Then uses the boundings boxes to produce a grid at the extent of africa. Then it projects that raster back to longlat for the overlay() procedure. map <- readShapePoly("E:/Science/continent.shp", ID="CONTINENT", proj4string = CRS("+proj=longlat")) africa <- as.SpatialPolygons.PolygonsList([EMAIL PROTECTED]) africa.proj <- spTransform(africa, CRS("+proj=moll")) grd <- GridTopology(c(bbox(africa.proj)[1,1]+5000, bbox(africa.proj)[2,1]+50000), c(100000,100000), c(ceiling((bbox(africa.proj)[1,2] - bbox(africa.proj)[1,1]) / 100000),ceiling((bbox(africa.proj)[1,2] - bbox(africa.proj)[1,1]) / 100000))) # if you should not have a coastline of africa: # these are the values you'll need to produce the raster you need to proceed # bbox(africa.proj) # min max # r1 -2472164 6131319 # r2 -4202811 4490010 polys.proj <- as.SpatialPolygons.GridTopology(grd) proj4string(polys.proj) <- CRS("+proj=moll") polys <- spTransform(polys.proj, CRS("+proj=longlat")) # now you have a spatialpolygon in longlat proj that has equal area and a # cell size of 100km2 #prepare a list for you results results <- rep(NA, length([EMAIL PROTECTED])) # use something like this to calculate the values per raster grid # this here is not working probably, as I didn't think about it all too much # I have though somewhere a code lying around doing exactly this step, so if # you don't succeed, let me know and I dig that out for(i in 1:length([EMAIL PROTECTED])) { results[i] <- mean(<your spatial points>$values[which(overlay(as.SpatialPolygons.PolygonsList([EMAIL PROTECTED] lygons[i]), <your Spatialpoints>) != NA, ]) } Apart from the final bits, I tested the start and it worked. The last bit should not be too difficult to solve. The whole thing could be more elegant by excluding those polygons that are in the sea. But I think that is something others can try to get their heads around it. Shouldn't be too difficult: get the centroid coordinates, overlay it with the costlines of Africa and convert it back into a grid... Hope this helped. Kamran ------------------------ Kamran Safi Postdoctoral Research Fellow Institute of Zoology Zoological Society of London Regent's Park London NW1 4RY http://www.zoo.cam.ac.uk/ioz/people/safi.htm http://spatialr.googlepages.com http://asapi.wetpaint.com -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Corrado Sent: 03 December 2008 09:29 To: [EMAIL PROTECTED]; r-sig-geo@stat.math.ethz.ch Subject: [R-sig-Geo] Raster file from ascii file and flattening Africa ....:) Dear friends, I am a kind of advanced newbie, if that makes sense. I have a text file of the form coordinate x,coordinate y,cat={real number between 250 and 450} where coordinate are expressed in latitude and longitude. The files represents measurements of the size of a skulls on sites all over Africa. >From it, I would like to build a raster file, 100 km by 100km. There are 2 problems: 1) Unfortunately, in some 100km x 100km squares, there is one of the points whilst in others there are maybe 20. How do I average, so that in each square I only have 1 value representing the average? 2) How do we "flatten" Africa so that we may use 100km x 100km squares instead of 1 degree x 1 degree, without committing a geographical crime? What we need is to respect the areas .... Best regards and apologies for the silliness of the questions. -- Corrado Topi Global Climate Change & Biodiversity Indicators Area 18,Department of Biology University of York, York, YO10 5YW, UK Phone: + 44 (0) 1904 328645, E-mail: [EMAIL PROTECTED] _______________________________________________ R-sig-Geo mailing list R-sig-Geo@stat.math.ethz.ch https://stat.ethz.ch/mailman/listinfo/r-sig-geo Click https://www.mailcontrol.com/sr/wQw0zmjPoHdJTZGyOCrrhg== rtsaKomrEVtGO6LLtLGhCXg+F32PftV4uyzpFBU8KFm0g== to report this email as spam. The Zoological Society of London is incorporated by Royal Charter Principal Office England. Company Number RC000749 Registered address: Regent's Park, London, England NW1 4RY Registered Charity in England and Wales no. 208728 _________________________________________________________________________ This e-mail has been sent in confidence to the named add...{{dropped:15}} _______________________________________________ R-sig-Geo mailing list R-sig-Geo@stat.math.ethz.ch https://stat.ethz.ch/mailman/listinfo/r-sig-geo