Ejemplos de uso de API¶
Listado de recursos y detalles¶
Como se mencionó en capítulos anteriores, los recursos de GeoNode se clasifican en diferentes tipos, p.conjuntos de datos, mapas, documentos.Etc. Todos los recursos disponibles se pueden enumerar con API GET /api/v2/resources.
Para obtener un único recurso, se proporciona una clave principal en la URL.Por ejemplo, GET /api/v2/resources/{resource.pk}.
Solicitudes de ejemplo:¶
Listado
import requests
url = "https://master.demo.geonode.org/api/v2/resources"
response = requests.request("GET", url)
Detalle
import requests
url = "https://master.demo.geonode.org/api/v2/resources/1797"
response = requests.request("GET", url)
Nota
Lo anterior solicita trabajo para recursos públicamente visibles.Si un recurso es privado, se debe incluir la autenticación básica o el token de portador dentro de los encabezados.
Listado con autenticación básica:
import requests
url = "https://master.demo.geonode.org/api/v2/resources"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Se puede utilizar un token en lugar de la autenticación básica configurando 'Autorización': 'Portador <token>'.
Descarga de recursos¶
La URL de descarga de un recurso se puede obtener en resource.download_url.Esta URL ejecuta la descarga sincrónica de un recurso en su formato de descarga predeterminado (ESRI Shapefile para vectores, Geotiff para rásteres y el formato original para documentos).Hay formatos de exportación adicionales para conjuntos de datos disponibles a través de la interfaz de usuario.Por el momento la API no los expone.
Enlaces de recursos¶
A partir de la respuesta detallada del recurso, se pueden obtener URL y enlaces a servicios a partir del valor de la matriz resource.links[].El propósito de cada enlace está definido por su link_type.El «nombre» también puede especificar información adicional sobre el recurso vinculado.
Metadatos¶
Los enlaces a cada formato de metadatos se pueden obtener desde enlaces con link_type = "metadata"
Servicios OGC¶
Las solicitudes de OGC se pueden crear tomando: la URL base de OGC de los enlaces de resource.links[] con "link_type"= ("OGC:WMS | OGC:WFS | OGC:WCS) el capaname del servicio OGC obtenido de la propiedad resource.alternate
Incrustar¶
Un recurso puede integrarse dentro de un sitio web de terceros.La “vista incrustada” de un recurso es adecuada para colocarse dentro de un iframe.La URL de la vista incrustada se puede obtener de la propiedad resource.embed_url.
Búsqueda y filtrado de recursos¶
Los recursos de GeoNode se pueden filtrar con los siguientes parámetros de consulta:
Parámetros |
URL |
|---|---|
título y resumen |
/api/v2/resources?page=1&search=text-to-search&search_fields=title&search_fields=abstracto |
tipo_recurso |
/api/v2/resources?filter{resource_type}=mapa |
subtipo |
/api/v2/resources?filter{resource_type}=vector |
favorito |
/api/v2/resources?favorite=true |
destacado |
/api/v2/resources?filter{featured}=true |
publicado |
/api/v2/resources?filter{is_published}=true |
aprobado |
/api/v2/resources?filter{is_approved}=true |
categoría |
api/v2/recursos?filtro{categoría.identificador}=ejemplo |
palabras clave |
/api/v2/resources?filter{palabras clave.nombre}=ejemplo |
regiones |
/api/v2/resources?filter{regions.name}=global |
owner |
/api/v2/resources?filter{propietario.nombre de usuario}=test_user |
extensión |
/api/v2/resources?extent=-180,-90,180,90 |
Ejemplos:
Filtrar con un solo valor
import requests
url = "https://master.demo.geonode.org/api/v2/resources/?filter{resource_type}=map"
response = requests.request("GET", url, headers=headers, data=payload
Filtrar con múltiples valores
import requests
url = "https://master.demo.geonode.org/api/v2/resources/?filter{resource_type.in}=map&filter{resource_type.in}=dataset"
response = requests.request("GET", url, headers=headers, data=payload)
Nota
Con las API de filtro de formato /api/v2/resources?filter{filter_key}=value, se pueden usar métodos adicionales (en e icontains) para proporcionar resultados ampliamente filtrados.Por ejemplo, /api/v2/resources?filter{regions.name.icontains}=global /api/v2/resources?filter{regions.name.in}=global.
Es importante tener en cuenta que otros métodos distinguen entre mayúsculas y minúsculas, excepto los íconos.
Recursos específicos del conjunto de datos¶
- Obtenga los metadatos de los conjuntos de datos cargados con:
API:
OBTENER /api/v2/datasets/{id}Código de estado:
200
Nota
Esto es muy similar a GET /api/v2/resources pero proporciona metadatos adicionales específicamente para conjuntos de datos como featureinfo_custom_template o attribute_set.
Ejemplo:
import requests DATASET_ID = "the dataset id" url = f"https://master.demo.geonode.org/api/v2/datasets/{DATASET_ID}" headers = { 'Authorization': 'Basic dXNlcjpwYXNzd29yZA==' } response = requests.request("GET", url, headers=headers)
Carga de recursos¶
La API admite la carga de conjuntos de datos y documentos.
El formulario de carga del conjunto de datos acepta formatos de archivo ESRI Shapefile, GeoTIFF, valores separados por comas (CSV), archivo Zip, archivo de metadatos XML y descriptor de capa con estilo (SLD).Para una carga exitosa, el formulario requiere base_file, dbf_file, shx_file y prj_file.Los archivos xml_file y Sld_file son opcionales.
API:
POST /api/v2/uploads/uploadCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/uploads/upload"
files= [
('sld_file',('BoulderCityLimits.sld',open('/home/myuser/BoulderCityLimits.sld','rb'),'application/octet-stream')), ('base_file',('BoulderCityLimits.shp',open('/home/BoulderCityLimits.shp','rb'),'application/octet-stream')), ('dbf_file',('BoulderCityLimits.dbf',open('/home/BoulderCityLimits.dbf','rb'),'application/octet-stream')), ('shx_file',('BoulderCityLimits.shx',open('/home/BoulderCityLimits.shx','rb'),'application/octet-stream')),
('prj_file',('BoulderCityLimits.prj',open('/home/myuser/BoulderCityLimits.prj','rb'),'application/octet-stream))
]
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("POST", url, headers=headers, files=files)
Los documentos se pueden cargar como datos de formulario.
API:
POST /api/v2/documentosCódigo de estado:
200
Ejemplo:
import requests
url = "http://localhost:8000/api/v2/documents"
payload={
'title': 'An example image'
}
files=[
('doc_file',('image.jpg',open('/home/myuser/image.jpg','rb'),'image/jpeg'))
]
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
También se pueden crear documentos para hacer referencia a recursos remotos.En este caso se debe utilizar el parámetro doc_url para configurar la URL del documento remoto.
API:
POST /api/v2/documentosCódigo de estado:
200
Ejemplo:
import requests
url = "http://localhost:8000/api/v2/documents"
payload={
'title': 'An example image',
'doc_url' : 'http://examples.com/image.jpg'
}
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
Tenga en cuenta que si la URL no termina con una extensión de documento válida, se debe utilizar el parámetro extensión (por ejemplo, ``extensión: “jpeg”`).
Seguimiento del progreso de la carga del conjunto de datos¶
Cuando se ejecuta una solicitud de carga, GeoNode crea una «solicitud de ejecución» y sigue actualizando sus atributos de estado y progreso (es un atributo de propiedad, calculado al obtener la respuesta) a medida que el recurso se crea y configura en Geoserver.Una ejecución puede estar en uno de los siguientes estados:
listo
corriendo
failed
terminado
Cuando el conjunto de datos se carga correctamente, el estado final de la carga se establece en «terminado».
Para ver el estado de la ejecución, el método API GET /api/v2/executionrequest/{execution_id} donde {execution_id} es el valor devuelto por la llamada inicial a la API de carga.
El objeto devuelto contiene, además de toda la información relacionada con la ejecución, las entradas que se pasaron a la solicitud de ejecución y los parámetros de salida específicos del tipo de ejecución.En el caso de la carga de un conjunto de datos, los parámetros de salida contienen la URL de la página del catálogo para el nuevo conjunto de datos.
"output_params": {
"detail_url": [
"/catalogue/#/dataset/9881"
]
},
También puede filtrar ejecuciones por estado.Por ejemplo, GET /api/v2/executionrequest?filter{action}=importar&filter{fuente}=cargar&filter{status}=finalizado
Ejemplo:
import requests
url = "https://stable.demo.geonode.org/api/v2/executionrequest/5f640b6b-8c51-4514-a054-995133fee107"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Sobrescribir un conjunto de datos¶
Cargar un recurso creará de forma predeterminada un nuevo conjunto de datos.Este comportamiento se puede cambiar estableciendo el parámetro overwrite_existing_capa en True.En este caso, el procedimiento de carga sobrescribirá un recurso cuyo nombre coincida con el nuevo.
Saltar conjunto de datos existente¶
Si el parámetro skip_existing_capas se establece en verdadero True, el procedimiento de carga ignorará los archivos cuyo nombre coincida con recursos ya existentes.
Carga de un archivo de metadatos¶
Se puede cargar un archivo de metadatos completo conforme a ISO-19115 para un conjunto de datos.
API:
PUT /api/v2/datasets/{dataset_id}/metadataCódigo de estado:
200
Ejemplo:
import requests
url = "http://localhost:8000/api/v2/datasets/1/metadata"
files=[
('metadata_file',('metadata.xml',open('/home/user/metadata.xml','rb'),'text/xml'))
]
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("PUT", url, headers=headers, data={}, files=files)
Eliminar recurso¶
API:
BORRAR /api/v2/resources/{pk}/deleteCódigo de estado:
204
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/resources/1778"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("DELETE", url, headers=headers)
Descarga de recursos¶
GeoNode ofrece una opción de descarga de recursos del conjunto de datos y documentos de tipo recurso.Para conjuntos de datos, la opción de descarga está disponible solo para conjuntos de datos con archivos cargados.
Conjuntos de datos¶
API:
GET /datasets/{resource.alternate}/dataset_downloadCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/datasets/geonode:BoulderCityLimits3/dataset_download"
response = requests.request("GET", url)
Documentos¶
API:
OBTENER /documentos/{resource.pk}/descargarCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/documents/1781/download"
response = requests.request("GET", url)
Metadatos de actualización del conjunto de datos¶
API:
PARCHE /api/v2/datasets/{id}Código de estado:
200
El siguiente ejemplo cambia el título y la licencia de un conjunto de datos.
import requests
url = ROOT + "api/v2/datasets/" + DATASET_ID
auth = (LOGIN_NAME, LOGIN_PASSWORD)
data = {
"title": "a new title",
"license": 4,
}
response = requests.patch(url, auth=auth, json=data)
Nota
bbox_polygon y ll_bbox_polygon son valores derivados que no se pueden cambiar.
Usuarios, grupos y permisos¶
Usuarios¶
Listado¶
API:
POST /api/v2/usuariosCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/users"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Detalle del usuario¶
API:
POST /api/v2/users/{pk}Código de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/users/1000"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Crear un nuevo usuario¶
API:
POST /api/v2/usuariosCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/users"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
payload={"username": "username",
"password": "password",
"email": "email@email.com",
"first_name":"first_name",
"last_name":"last_name",
"avatar": "https://www.gravatar.com/avatar/7a68c67c8d409ff07e42aa5d5ab7b765/?s=240"}
response = requests.request("POST", url, headers=headers, data=payload)
Editar un usuario¶
API:
PARCHE /api/v2/users/{pk}Código de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/users/1000"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
payload={"password": "new_password"}
response = requests.request("PATCH", url, headers=headers, data=payload)
Eliminar un usuario¶
API:
BORRAR /api/v2/users/{pk}Código de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/users/1000"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
payload={"password": "new_password"}
response = requests.request("DELETE", url, headers=headers, data=payload)
En este caso, la lista de reglas de validación configuradas en USER_DELETION_RULES se verifica antes de ejecutar la eliminación.
Listar grupos de usuarios¶
API:
POST /api/v2/usuarios/{pk}/groupsCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/users/1000/groups"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Transferir recursos propiedad de un usuario a otro¶
API:
POST /api/v2/users/{pk}/transfer_resourcesCódigo de estado:
200
Ejemplo:
import requests
payload={"owner": 1001}
url = "https://master.demo.geonode.org/api/v2/users/1000/transfer_resources"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("POST", url, headers=headers, data=payload)
En este caso, los recursos se transferirán al usuario con ID 1001; en lugar de usar payload={«owner»: «DEFAULT»}, los recursos se transferirán al usuario principal.
Eliminar usuario como administrador de grupo¶
API:
POST /api/v2/users/{pk}/remove_from_group_managerCódigo de estado:
200
Ejemplo:
import requests
payload={"groups": [1,2,3]}
url = "https://master.demo.geonode.org/api/v2/users/1000/remove_from_group_manager"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("POST", url, headers=headers, data=payload)
En este caso, el usuario será eliminado como administrador de grupo de los siguientes ID de grupo; si la carga útil sería payload={«groups»: «ALL»}, el usuario será eliminado como administrador de grupo de todos los grupos de los que forma parte.
Grupos¶
En GeoNode, al enumerar grupos, la API devuelve grupos que tienen perfiles de grupo.Por lo tanto, los grupos de Django que no están relacionados con un perfil de grupo no se incluyen en la respuesta.Sin embargo, se puede acceder a ellos en el panel de administración de Django.
API:
POST /api/v2/groupsCódigo de estado:
200
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/groups"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Permisos¶
Los permisos en GeoNode se establecen por recurso y por usuario o grupo.Los siguientes son permisos generales que se pueden asignar:
Ver: permite ver el recurso.``[view_resourcebase]``
Descargar: permite descargar el recurso específicamente conjuntos de datos y documentos.``[ ver_resourcebase, descargar_resourcebase]``
Editar: permite cambiar atributos, propiedades de las características, estilos y metadatos del conjunto de datos para el recurso especificado.``[view_resourcebase, download_resourcebase, change_resourcebase, change_dataset_style, change_dataset_data, change_resourcebase_metadata]``
Administrar: permite actualizar, eliminar, cambiar permisos, publicar y despublicar el recurso.``[view_resourcebase, download_resourcebase, change_resourcebase, change_dataset_style, change_dataset_data, publicar_resourcebase, eliminar_resourcebase, change_resourcebase_metadata, change_resourcebase_permissions]``
Obtener permisos sobre un recurso¶
Al enumerar los recursos o en la API de detalles de recursos, GeoNode incluye el atributo de permisos para cada recurso con una lista de permisos que tiene un usuario que realiza la solicitud sobre el recurso respectivo.
GeoNode también proporciona una API para obtener una descripción general de los permisos establecidos en un recurso.La respuesta contiene usuarios y grupos con permisos establecidos.Sin embargo, esta API devuelve 200 si un usuario solicitante tiene permisos de administrar en el recurso; de lo contrario, devolverá 403 (Prohibido).
API:
GET /api/v2/resources/1791/permissions
Ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/resources/1791/permissions"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("GET", url, headers=headers)
Cambiar permisos en un recurso¶
Los permisos se configuran con la denominada especificación de permisos, que es una estructura JSON donde se pueden especificar permisos para usuarios individuales y grupos.
El siguiente ejemplo muestra una especificación permanente para las siguientes reglas:
user1 can
edituser2 can
managegrupo1 puede
editarlos usuarios anónimos (públicos) pueden
verlos miembros registrados pueden
descargar
NOTA: La identificación de los grupos “anónimos” y “miembros registrados” se puede obtener de los permisos del recurso.No aparecen dentro de la API de grupos, ya que son grupos internos especiales.
{
"users": [
{
"id": <id_of_user1>,
"permissions": "edit"
},
{
"id": <id_of_user2>,
"permissions": "manage"
}
],
"organizations": [
{
"id": <id_of_group1>,
"permissions": "edit"
},
],
"groups": [
{
"id": <id_of_anonymous_group>,
"permissions": "view"
},
{
"id": <id_of_regisdtered-members_group>,
"permissions": "download"
}
]
}
La especificación permanente se envía como JSON, con application/json Content-Type, dentro de una solicitud PUT.
import requests
import json
url = "https://master.demo.geonode.org/api/v2/resources/1791/permissions"
payload = json.dumps({
"users": [
{
"id": 1001,
"permissions": "edit"
},
{
"id": 1002,
"permissions": "manage"
}
],
"organizations": [
{
"id": 1,
"permissions": "edit"
}
],
"groups": [
{
"id": 2,
"permissions": "view"
},
{
"id": 3,
"permissions": "download"
}
]
})
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA==',
'Content-Type': 'application/json',
}
response = requests.request("PUT", url, headers=headers, data=payload)
Esta es una operación asincrónica que devuelve una respuesta similar a la siguiente:
{
"status": "ready",
"execution_id": "7ed578c2-7db8-47fe-a3f5-6ed3ca545b67",
"status_url": "https://master.demo.geonode.org/api/v2/resource-service/execution-status/7ed578c2-7db8-47fe-a3f5-6ed3ca545b67"
}
La propiedad status_url devuelve la URL para rastrear el progreso de la solicitud.Al consultar la URL se devolverá un resultado similar al siguiente:
{
"user": "admin",
"status": "running",
"func_name": "set_permissions",
"created": "2022-07-08T11:16:32.240453Z",
"finished": null,
"last_updated": "2022-07-08T11:16:32.240485Z",
"input_params": {
…
}
}
La operación se completará una vez que la propiedad status se actualice con el valor finished.
Listado y detalles de recursos vinculados¶
Todos los recursos_vinculados disponibles se pueden enumerar con API GET /api/v2/resources/{pk}/linked_resources.donde pk ID de la base de recursos
Solicitudes de ejemplo:¶
Listar todos los enlaces de recursos
import requests
url = "https://master.demo.geonode.org/api/v2/resources/{pk}/linked_resources"
response = requests.request("GET", url)
Activos¶
Carga de activos¶
Los activos se pueden adjuntar a un recurso como un archivo.
Punto final:
API:
POST /api/v2/resources/{pk}/assets/Código de estado:
201
donde {pk} es la identificación de la base de recursos a la que se adjuntará el activo.
Parámetros:
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
Archivos |
Los archivos a cargar pueden ser varios archivos. |
|
Cadena |
Título del bien que es opcional. |
|
Cadena |
Descripción del activo que es opcional. |
Solicitud de ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/resources/{pk}/assets/"
payload = {
'title': 'My Asset Title',
'description': 'Description of my asset'
}
files=[
('file',('assets.png',open('/location/of/file','rb'),'image/png'))
]
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
Eliminación de activos¶
Los activos adjuntos se pueden eliminar de un recurso.
Punto final:
API:
BORRAR /api/v2/resources/{resource_pk}/assets/{asset_pk}Código de estado:
204
donde {resource_pk} es la identificación de la base de recursos de la cual se eliminará el activo y {asset_pk} es la identificación del activo que se eliminará.
Solicitud de ejemplo:
import requests
url = "https://master.demo.geonode.org/api/v2/resources/{resource_pk}/assets/{asset_pk}"
headers = {
'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='
}
response = requests.request("DELETE", url, headers=headers)