Introduction to the Survey Solutions API R-package
Why this package
The World Bank’s Computer Assisted Survey System (CASS) Survey Solutions is a powerful tool for high quality data collection and used in many statistical offices around the world. Besides the standard GUI, it also comes with a powerful REST API. For details see https://docs.mysurvey.solutions/
To further facilitate its integration in a fully automated workflow we have developed this R package, which covers almost all of the available API calls. With this vignette you get a first overview on the different functions, further vignettes are available on survey management, paradata analysis and shiny integration.
The package can be considered as being a API “bare bone”, as it implements the basic Survey Solutions API calls without substantial modification. However, this is not true for the data export function as well as for the paradata. Modification was necessary to facilitate workflow integration. See the details in the corresponding documentation.
Please be aware, that this package makes heavy use of data.table, and this is also continued in this vignette. In case you are not familiar with it yet, you should probably have a look a this introduction.
API credentials
To use the API you first need to set-up the API user on your Survey Solutions server. See here for details. After this done, you can use the suso_set_key() function, to provide your credentials.
library(SurveySolutionsAPI)
suso_clear_keys()
suso_set_key("https://xxx.mysurvey.solutions", "xxxxxx", "xxxxxxx")
suso_keys()
#> $suso
#> $suso$susoServer
#> [1] "https://xxx.mysurvey.solutions"
#>
#> $suso$susoUser
#> [1] "xxxxxx"
#>
#> $suso$susoPass
#> [1] "xxxxxxx"
#>
#>
#> attr(,"class")
#> [1] "suso_api"
After this is done, there is no need to provide the credentials for every API call again. They are stored until the end of your current session. There is also a function to check if your credentials work.
suso_PwCheck()
#> [1] "https://michael-wild-demo.mysurvey.solutions/primary/api/v1/supervisors?limit=200"
#> Response [https://michael-wild-demo.mysurvey.solutions/primary/api/v1/supervisors?limit=200]
#> Date: 2023-02-16 17:24
#> Status: 200
#> Content-Type: application/json; charset=utf-8
#> Size: 482 B
In case no workspace is provided, this call (like all the other calls) will default to the primary workspace. However if a workspace is provided, then the check will be performed on the provided workspace.
suso_PwCheck(workspace = "test")
#> [1] "https://michael-wild-demo.mysurvey.solutions/test/api/v1/supervisors?limit=200"
#> Response [https://michael-wild-demo.mysurvey.solutions/test/api/v1/supervisors?limit=200]
#> Date: 2023-02-16 17:24
#> Status: 200
#> Content-Type: application/json; charset=utf-8
#> Size: 4.54 kB
It calls the supervisor API, and returns the response. If the return value is 200, then your connection and credentials are OK. For further information on API response status codes have a look here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status.
Workspace Management
You can also manage your workspaces through the API. In particular, you can
- request a list of all workspaces the API user has access to, as well as
- create new workspaces
- and assign users to a particular workspace.
However for the latter two operations you require ADMIN credentials. Standard API user credentials would not work.
To receive a list of workspaces to which the current API user has access to, you can just run:
ws <- suso_getWorkspace()
print(head(ws))
#> Name DisplayName DisabledAtUtc
#> 1: primary Default Workspace NA
#> 2: test test NA
#> 3: test2 test2 NA
To receive a list of all workspaces in the system (even those to which the current API user does not have access to) you can do the same, and use the ADMIN password:
ws <- suso_getWorkspace(apiUser = adminUser, apiPass = adminPass)
#> Error in stopifnot(is.character(user), length(user) == 1): object 'adminUser' not found
print(head(ws))
#> Name DisplayName DisabledAtUtc
#> 1: primary Default Workspace NA
#> 2: test test NA
#> 3: test2 test2 NA
For the next two operations, the use of admin credentials is mandatory, they will not work with a standard API user. The first one of these two is the creation of a new workspace:
ws <- suso_createWorkspace(apiUser = adminUser, apiPass = adminPass, your_workspace = "test", new_workspace = "test11", displayName = "ExtraExtraWorkspace")
#> Error in stopifnot(is.character(user), length(user) == 1): object 'adminUser' not found
print(head(ws))
#> Name DisplayName DisabledAtUtc
#> 1: primary Default Workspace NA
#> 2: test test NA
#> 3: test2 test2 NA
The return value from the function already tells you, that the new workspace has been successfully created, however to double check, you can also get the full list again:
ws <- suso_getWorkspace(apiUser = adminUser, apiPass = adminPass)
#> Error in stopifnot(is.character(user), length(user) == 1): object 'adminUser' not found
print(head(ws))
#> Name DisplayName DisabledAtUtc
#> 1: primary Default Workspace NA
#> 2: test test NA
#> 3: test2 test2 NA
Finally you can also assign a new user to this workspace by using the suso_assignWorkspace function.
ws <- suso_assignWorkspace(your_workspace = "test", assign_workspace = "test11", apiUser = adminUser, apiPass = adminPass, uid = "34c2bc7b-ec33-473b-875b-dc06d269fced", sv_id = "34c2bc7b-ec33-473b-875b-dc06d269fced")
#> Error in stopifnot(is.character(user), length(user) == 1): object 'adminUser' not found
print(head(ws))
#> Name DisplayName DisabledAtUtc
#> 1: primary Default Workspace NA
#> 2: test test NA
#> 3: test2 test2 NA
Further details on workspaces can be found in the dedicated vignette on user management.
User Management
These functions are particularly useful for survey management, and more details can be found in the corresponding vignette on survey management. Lets start with getting a list of all supervisors on the server.
sv <- suso_getSV(workspace = "test")
print(head(sv))
#> IsLocked CreationDate UserId UserName
#> 1: FALSE 2023-02-07 17:33:40 00d21677-0331-4698-ae7b-908aeac14dd6 somesvuser
#> 2: FALSE 2023-02-04 19:05:10 ded27a4a-716d-4bf2-8d54-aedc31fc164b SV0001
#> 3: FALSE 2023-02-04 19:36:03 5753ddde-3c7d-438f-9934-43fdf18fa802 SV0002
#> 4: FALSE 2023-02-04 19:36:03 72196c84-8f2f-488a-8d61-f23b8b998d43 SV0003
#> 5: FALSE 2023-02-04 19:36:03 1a9d4b10-c92d-401d-af69-2a7d0a391fe6 SV0004
#> 6: FALSE 2023-02-04 19:36:03 97e9e4ff-22e1-492f-a102-03c2115903e7 SV0005
Your will receive a list of supervisors currently active (not archived) on the server. If you take one of the supervisor’s id and use the suso_getINT function, you will receive all the interviewers in the team.
int <- suso_getINT(sv_id = sv[3, UserId], workspace = "test")
print(int)
#> IsLocked CreationDate UserId UserName
#> 1: FALSE 2023-02-04 19:36:03 14ee97f1-ae8d-44f5-8a30-4c3617f03002 INT0012
#> 2: FALSE 2023-02-04 19:36:03 4a1d5b37-2db1-448c-adc2-0a26379956fe INT0013
To receive more information about a particular user, use the suso_getINT_info function:
intinfo <- suso_getINT_info(int_id = int[1, UserId], workspace = "test")
print(intinfo)
#> SupervisorName SupervisorId IsLockedBySupervisor IsLockedByHeadquarters IsArchived UserId UserName Role IsLocked
#> 1: SV0002 5753ddde-3c7d-438f-9934-43fdf18fa802 FALSE FALSE FALSE 14ee97f1-ae8d-44f5-8a30-4c3617f03002 INT0012 Interviewer FALSE
#> CreationDate FullName
#> 1: 2023-02-04 19:36:03 Ashlie Spinka
To get information about any particular user, you can also use the more general function suso_getUSR.
usrinfo_int <- suso_getUSR(uid = sv[3, UserId], workspace = "test")
print(usrinfo_int)
#> IsArchived UserId UserName Role IsLocked CreationDate FullName
#> 1: FALSE 5753ddde-3c7d-438f-9934-43fdf18fa802 SV0002 Supervisor FALSE 2023-02-04 19:36:03 Isidro Dach II
usrinfo_int <- suso_getUSR(uid = int[1, UserId], workspace = "test")
print(usrinfo_int)
#> IsArchived UserId UserName Role IsLocked CreationDate FullName
#> 1: FALSE 14ee97f1-ae8d-44f5-8a30-4c3617f03002 INT0012 Interviewer FALSE 2023-02-04 19:36:03 Ashlie Spinka
Questionnaire
The basic questionnaire API calls are handled through the suso_getQuestDetails function.
If no input is provided, the function returns a list of all questionnaires on the server:
questlist <- suso_getQuestDetails(workspace = "test")
# print(questlist)
Specifying operation.type = status, you receive a list of statuses.
statlist <- suso_getQuestDetails(operation.type = "statuses", workspace = "test")
print(statlist)
#> [1] "Restored" "Created" "SupervisorAssigned" "InterviewerAssigned" "RejectedBySupervisor" "ReadyForInterview" "SentToCapi"
#> [8] "Restarted" "Completed" "ApprovedBySupervisor" "RejectedByHeadquarters" "ApprovedByHeadquarters" "Deleted"
By taking a particular QuestionnaireId and specifying the *operation.type *you can execute further requests. For example,
questionnaire <- suso_getQuestDetails(operation.type = "structure", workspace = "test", quid = questlist[1, QuestionnaireId], version = questlist[1, Version])
questionnaire <- questionnaire[, .(VariableName, type, QuestionText, Featured, PublicKey)]
#> Error in .(VariableName, type, QuestionText, Featured, PublicKey): could not find function "."
questionnaire <- questionnaire[!is.na(QuestionText)]
#> Error in eval(expr, envir, enclos): object 'QuestionText' not found
head(questionnaire$q, 19L)
#> Id LastEntryDate L0 type PublicKey Title L1 VariableName QuestionScope
#> 1: dee7705fd6114b129b972b8e5b80c4ea 2022-07-15T17:56:56.4811273 1 Group c46ee895-0e6e-4063-8136-31e6bfa7c3f8 COVER NA <NA> NA
#> 2: dee7705fd6114b129b972b8e5b80c4ea 2022-07-15T17:56:56.4811273 2 Group fdeaf889-ba80-89c5-6d60-8c1b1196ebe5 DWELLING NA <NA> NA
#> 3: dee7705fd6114b129b972b8e5b80c4ea 2022-07-15T17:56:56.4811273 3 Group 1f949736-beb1-dd10-6451-561b7799c99c RESULTS AND CONCLUSION NA <NA> NA
#> 4: <NA> <NA> 1 TextQuestion 59e2b882-0b67-78cf-d08a-0760e98d5157 <NA> 1 q01 0
#> 5: <NA> <NA> 1 TextQuestion 95c9e53e-6603-a96e-0dee-ce0584076a16 <NA> 2 q02 0
#> 6: <NA> <NA> 1 TextQuestion 4af6c880-658a-b610-53fc-4a2bdd5cfe2c <NA> 3 q03 0
#> 7: <NA> <NA> 1 TextQuestion 0dd2cbb5-1617-fb3b-1494-394ec4aceb4c <NA> 4 q04 0
#> 8: <NA> <NA> 1 TextQuestion 4c20c6f7-ff1b-8884-3b7b-cb7c42f23396 <NA> 5 q05 0
#> 9: <NA> <NA> 1 SingleQuestion 3870444e-932a-676b-c109-7cb8b22e1520 <NA> 6 q06 0
#> 10: <NA> <NA> 1 TextQuestion 1f328d26-2264-f86a-bd62-9d69ed0e6010 <NA> 7 q07 0
#> 11: <NA> <NA> 1 TextQuestion 426d51a2-4ecb-9256-4074-2d711a8ff273 <NA> 8 q08 0
#> 12: <NA> <NA> 1 TextQuestion 60068eee-c5c6-738c-235d-d0d540bebf8a <NA> 9 q09 0
#> 13: <NA> <NA> 1 GpsCoordinateQuestion 09024983-6bc6-9ad7-bdc7-cdb6864d1292 <NA> 10 q10 0
#> 14: <NA> <NA> 2 StaticText 4d34d956-8a7a-eb0b-a0e8-00a9648a6cc0 <NA> 1 NA
#> 15: <NA> <NA> 2 NumericQuestion 1d4e607d-50fb-4d3e-20c6-b4a35a3f5bc8 <NA> 2 northBound 3
#> 16: <NA> <NA> 2 NumericQuestion 256085f2-2725-e8d2-2475-14e4a9c6cc62 <NA> 3 southBound 3
#> 17: <NA> <NA> 2 NumericQuestion 2ca4ef6b-46db-6f89-0527-98fb5605c6d3 <NA> 4 eastBound 3
#> 18: <NA> <NA> 2 NumericQuestion 0df2ac09-c7d2-e1d6-3b5c-0beadf69e218 <NA> 5 westBound 3
#> 19: <NA> <NA> 2 NumericQuestion fbbaad6d-c38e-8bf1-56e9-f325ff37d6ae <NA> 6 subCellsDivisor 3
#> QuestionText Featured L2 ..JSON intID
#> 1: <NA> NA NA <list[16]> 01NANA
#> 2: <NA> NA NA <list[16]> 02NANA
#> 3: <NA> NA NA <list[16]> 03NANA
#> 4: *1.Province TRUE NA <list[17]> 0101NA
#> 5: *2. Territory/City TRUE NA <list[17]> 0102NA
#> 6: *3. Health zone TRUE NA <list[17]> 0103NA
#> 7: 4. Health area TRUE NA <list[17]> 0104NA
#> 8: *5. Grid cell number TRUE NA <list[18]> 0105NA
#> 9: 6. Sub cell number TRUE NA <list[19]> 0106NA
#> 10: 7. Urban commune/ Rural commune/ Sector/ Chiefdom TRUE NA <list[17]> 0107NA
#> 11: 8. Grouping TRUE NA <list[17]> 0108NA
#> 12: 9. Village/Quarter TRUE NA <list[17]> 0109NA
#> 13: *10. GPS Coordinates of the Grid Cell TRUE NA <list[17]> 0110NA
#> 14: <NA> NA NA <list[9]> 0201NA
#> 15: *~ North boundary FALSE NA <list[20]> 0202NA
#> 16: *~ South boundary FALSE NA <list[20]> 0203NA
#> 17: *~ East boundary FALSE NA <list[20]> 0204NA
#> 18: *~ West boundary FALSE NA <list[20]> 0205NA
#> 19: *~ Sub-cell divider FALSE NA <list[19]> 0206NA
Gives you a data.table which contains all the questions, question texts, etc. which you can use for further processing i.e to render a user manual with rmarkdown. Find details in the manual on questionnaire creation.
You can also get a list of all interviews done for the specific questionnaire.
interviews <- suso_getQuestDetails(operation.type = "interviews", workspace = "test", quid = questlist[1, QuestionnaireId], version = questlist[1, Version])
interviews <- interviews[, .(InterviewId, AssignmentId, ResponsibleId, ErrorsCount, Status)]
head(interviews, 20L)
#> InterviewId AssignmentId ResponsibleId ErrorsCount Status
#> 1: 7d91c038-e258-4948-a7a2-566cda5b4dc5 1 3b0c6e09-d606-4914-9e20-2abc048d5bea 0 ApprovedBySupervisor
#> 2: 343da912-5a9f-4875-821b-6f0e1440150b 48 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 RejectedBySupervisor
#> 3: a9620548-b1d8-418c-9c1f-a0d64031968a 234 3b0c6e09-d606-4914-9e20-2abc048d5bea 0 RejectedBySupervisor
#> 4: 79202304-8ba6-4c87-b45a-3f56529fc6e4 235 366cb1f7-30fa-48bf-9b56-ffa4ec8b0861 0 RejectedBySupervisor
#> 5: 7d04a07e-5c99-44f6-974f-531d8ed5a560 239 366cb1f7-30fa-48bf-9b56-ffa4ec8b0861 0 InterviewerAssigned
#> 6: ea10292e-7ac6-4fa3-bf82-d4d24fee98ba 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 Completed
#> 7: 1d9305db-2be3-44d6-baf2-cf560a9ff45d 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 Completed
#> 8: 782d1652-c6f5-4d02-882e-e372e97dfa83 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 Completed
#> 9: 8621b894-43bd-4e4e-bfa3-0e67cdf5abb8 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 Completed
#> 10: beeb70f4-ea94-4eb7-af5c-bc15abcfa9ed 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 Completed
#> 11: 90badf8a-199a-4247-94a9-51a14bf308fa 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 12: d63ced87-589b-4316-8e8f-e247c4779877 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 13: 43045bd2-325c-4649-81b3-4f1841048034 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 14: 1054b136-c94f-4851-b8c2-ca4e003f4358 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 15: a43b0480-8fdb-4d43-b6fe-29420bf8eb71 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 0 Completed
#> 16: 2f829f02-c844-439b-88a2-326b98412204 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 17: 0dc4f8a1-d740-440f-bdc6-2e34df997d00 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 18: ccc03ee9-1974-4356-98f0-648e0395e932 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 19: a02bd8fa-e048-43f2-88ad-f5e43c2cc67b 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
#> 20: 605afedd-19e6-4941-b51c-b12d885274eb 1 a67d2b82-bf28-40cf-bd1a-7901225c0885 1 Completed
Quick statistics –> Attention: this call is currently returning a 500 error, the Survey Solutions team is working on it.
To monitor variables of interest, you can use the suso_get_stats function.
# statquest<-suso_get_stats(questID = questlist[1, QuestionnaireId], workspace = 'test', version = questlist[1, Version], qQuest = questionnaire[19, PublicKey]) print(statquest)
Full data export
To export the data collected in Survey Solutions, you use suso_export.
#> The last file has been created 0.06833 hours ago.
#> FileName: assignment__actions
#> Nesting Level: 0
#> ****
#>
#> FileName: households
#> Nesting Level: 1
#> ****
#>
#> FileName: interview__actions
#> Nesting Level: 0
#> ****
#>
#> FileName: interview__diagnostics
#> Nesting Level: 0
#> ****
#>
#> FileName: interview__errors
#> Nesting Level: 0
#> ****
Its return value is a list with the following elememts: main, R1, R2, R3, with
- main containing the files: interview__comments, kasai_listing1
- R1 containing all rosters at the first level
- R2 containing all rosters at the second level
- R3 containing all rosters at the third level
through the harmonized ID, main and rosterfiles can easily be put together. More on this in the specific vignette.
Paradata
To retrieve the paradata for a particular interview you use suso_export_paradata
system.time(para1 <- suso_export_paradata(questID = questlist[1, QuestionnaireId], workspace = "test", version = questlist[1, Version], reloadTimeDiff = 24, onlyActiveEvents = F, allResponses = T))
#>
#> The last file has been created 1 hours ago.
#>
#> Starting download & file extraction.
#>
#>
#> Calculating Response Timings.
#>
#> Extracting GPS variable.
#> Processing:
#> AnswerSet
#>
#> AnswerRemoved
#>
#> ApproveByHeadquarter
#>
#> Restarted
#>
#> Reject
#>
#> QuestionDeclaredInvalid
#>
#> QuestionDeclaredValid
#>
#> Export & Transformation finished.
#> user system elapsed
#> 0.536 0.036 0.820
This will return a list of data.tables, separated by events. Please bear in mind, that paradata files can be fairly big, and processing it may require a large working memory. To decrease the load there are also 3 parameters you can change, these are:
- onlyActiveEvents, if TRUE it processes only the active events initiated by users.
- allResponses, if FALSE, does not process all response values, nevertheless they are still included in a single column. Otherwise, they are separated by column.
Running the same call again without passive events and without all responses processed, reduces processing time significantly.
system.time(para2 <- suso_export_paradata(questID = questlist[1, QuestionnaireId], workspace = "test", version = questlist[1, Version], reloadTimeDiff = 24, onlyActiveEvents = T, allResponses = F))
#>
#> The last file has been created 1 hours ago.
#>
#> Starting download & file extraction.
#>
#>
#> Calculating Response Timings.
#>
#> Extracting GPS variable.
#> Processing:
#> AnswerSet
#>
#> AnswerRemoved
#>
#> ApproveByHeadquarter
#>
#> Restarted
#>
#> Reject
#>
#> Export & Transformation finished.
#> user system elapsed
#> 0.524 0.028 0.818
As you see from the system timings, changing these parameters reduces processing time significantly. More details on how to work with paradata can be found in the corresponding vignette. The paradata export is returned as a list, with the following elements:
- full data: KeyAssigned, Completed, AnswerSet, AnswerRemoved, Restarted, Reject, QuestionDeclaredInvalid, QuestionDeclaredValid, actionDistr, userDistr, roleDistr
- reduced data: KeyAssigned, Completed, AnswerSet, AnswerRemoved, Restarted, Reject, actionDistr, userDistr, roleDistr
There are also tables already included in the file, like:
para2[["userDistr"]]
#> responsible count
#> 1: 918
#> 2: int1 804
which gives the distribution of events by user, or:
para2[["actionDistr"]]
#> action count
#> 1: QuestionDeclaredValid 747
#> 2: AnswerSet 646
#> 3: VariableSet 129
#> 4: Resumed 25
#> 5: Paused 25
#> 6: TranslationSwitched 23
#> 7: KeyAssigned 17
#> 8: InterviewCreated 17
#> 9: SupervisorAssigned 17
#> 10: InterviewModeChanged 17
#> 11: InterviewerAssigned 17
#> 12: Completed 17
#> 13: ReceivedBySupervisor 16
#> 14: QuestionDeclaredInvalid 9
which gives the distribution by event type.
Map management
Since recently, it is now also possible, to handle maps through the API. This is implemented through the lately introduced GraphQL API.
To upload a map, you can just use the suso_mapupload function like this:
suso_mapupload(workspace = "test", path_to_zip = mapPath)
#> xMaxVal yMaxVal xMinVal yMinVal wkid fileName size maxScale minScale shapeType importDateUtc uploadedBy users
#> 1: -78.39 26.8 -78.62 26.55 4326 checkshapesimple.shp 20467 0 0 Polygon 2023-02-16 17:24:47 961d073f-f316-4353-9e7e-1f00899cb837 <list[0]>
To assign a map you can use the suso_mapassign function:
suso_mapassign(workspace = "test", fileName = "checkshapesimple.shp", userName = "INT0004")
#> fileName user shapeType importDateUtc
#> 1: checkshapesimple.shp INT0004 Polygon 2023-02-16 17:24:47
And to check the current maps on the server, and to whom they are assigned, you can use:
suso_mapinfo(workspace = "test")
#> fileName maxScale minScale shapeType shapesCount size importDateUtc uploadedBy userName xMaxVal yMaxVal xMinVal
#> 1: seg_Lat14701Lon379.shp 0 0 Polygon 4 1558 2023-01-26 16:07:54 25628149-1164-4405-b2a2-41a114700215 INT0004 171407.96 5229062.505 171313.10
#> 2: seg_Lat14701Lon379.shp 0 0 Polygon 4 1558 2023-01-26 16:07:54 25628149-1164-4405-b2a2-41a114700215 INT0005 171407.96 5229062.505 171313.10
#> 3: seg_Lat14703Lon375.shp 0 0 Polygon 4 1558 2023-01-26 16:07:55 25628149-1164-4405-b2a2-41a114700215 <NA> 165982.27 5231732.606 165887.31
#> 4: seg_Lat14706Lon376.shp 0 0 Polygon 4 1558 2023-01-26 16:07:55 25628149-1164-4405-b2a2-41a114700215 <NA> 166739.20 5236147.192 166644.21
#> 5: checkshapesimple.shp 0 0 Polygon 1 20467 2023-02-16 17:24:47 961d073f-f316-4353-9e7e-1f00899cb837 INT0004 -78.39 26.798 -78.62
#> 6: Lat9260Lon650_ALL.tif 0 0 <NA> NA 8658427 2023-02-15 22:16:05 25628149-1164-4405-b2a2-41a114700215 <NA> 22.37 -6.681 22.36
#> 7: Lat9263Lon605_ALL.tif 0 0 <NA> NA 8643131 2023-02-15 22:16:06 25628149-1164-4405-b2a2-41a114700215 <NA> 21.96 -6.654 21.95
#> 8: Lat9263Lon686_ALL.tif 0 0 <NA> NA 8663511 2023-02-15 22:16:07 25628149-1164-4405-b2a2-41a114700215 <NA> 22.69 -6.652 22.68
#> 9: Lat9264Lon625_ALL.tif 0 0 <NA> NA 2165023 2023-02-15 22:16:07 25628149-1164-4405-b2a2-41a114700215 <NA> 22.14 -6.645 22.13
#> yMinVal wkid
#> 1: 5228935.260 4326
#> 2: 5228935.260 4326
#> 3: 5231605.274 4326
#> 4: 5236019.808 4326
#> 5: 26.546 4326
#> 6: -6.690 4326
#> 7: -6.663 4326
#> 8: -6.662 4326
#> 9: -6.654 4326
We hope that gave you a short overview on the available functions. For more details on how to use the output, please read the specific vignettes.