SkyDrive. Geo-Localización de fotos

Para obtener la geo-posición de una foto, tenemos que extraer la información Exif que se encuentra en ella y obtener las propiedades System.GPS.Latitude y System.GPS.Longitude.

Si trabajamos con fotos locales, la obtención de esa información es inmediata porque sólo tenemos que cargar en memoria el Bitmap y extraer la información de Exif de ella, bien mediante una librearía o utilizando WinRT (si estamos haciendo una aplicación Metro). El problema nos lo encontramos en la nube.

Cuando desarrollamos una aplicación que muestra las fotos que tenemos en SkyDrive, nos preocupamos bastante de minimizar la transferencia de datos y mostramos la imagen en modo thumbnail, siempre que nos sea posible. En Windows 8 sería tal como sigue:

// Inicializamos la conexión a SkyDrive utilizando oAuth

await InitAuth(true);

LiveConnectClient client = new LiveConnectClient(App.Session);

 

// Obtenemos los ficheros de album específico

LiveOperationResult pictureOperationResult = await client.GetAsync(album.UniqueId + "/files");

dynamic pictureResult = pictureOperationResult.Result;

foreach (dynamic item in pictureResult.data)

{

    var picture = new SkyDrivePicture();

    picture.UniqueId = item.id;

    picture.Title = item.name;

    

    // La propiedad picture tiene el thumbnail de la imagen, mientras que la propiedad source tiene la imagen completa

    picture.SetThumbnail(item.picture);

 

    items.Add(picture);

}

El problema es que los metadatos Exif no se encuentran en el thumbnail y esto nos obliga a descargar la imagen completa, hablamos de un mega y medio para imagenes de móviles, cargar en memoria el Bitmap de esa imagen y extraer la información Exif (no podemos utilizar el API de WinRT salvo que la guardemos a disco).

SkyDrive al rescate.

Revisando los objetos del API de SkyDrive tenemos la mejor solución. El objeto Photo, entre otras propiedades, la información que necesitamos: la localización de la foto en la propiedad location. ´

// item es el elemento dinámico Photo que obtenemos del Result de la consulta al album

if (item.location != null)

{

    picture.Latitude = item.location.latitude;

    picture.Longitude = item.location.longitude;

}

 

Aunque no tengamos todas las propiedades de Exif, si que podemos acelerar nuestro proceso ahorrando tiempo y descarga de datos leyendo estas propiedades y algunas otras que podamos tener, como la fecha en la que fue tomada la foto.

 

Saludos a todos…

SSIS. Extracción de datos de listas de SharePoint

En la última charla con los expertos de SharePoint, se planteó el problema de extracción de datos de listas para incluirlos en un Data Warehouse, y la respuesta fue sencilla. Si lo que queremos es incluir en el proceso de extracción y transformación de datos, información almacenada en listas de SharePoint, existe un proyecto en Codeplex, Microsoft SQL Server Community Samples: Integration Service, en el que han incluido ejemplos de conectores de orígenes y destino para listas de SharePoint (http://sqlsrvintegrationsrv.codeplex.com/releases/view/17652).

Estos utilizan los servicios web de SharePoint y permiten seleccionar los campos a extraer, ejecutar consultas paginadas para listas largas, especificar la consulta CAML, entre otras funcionalidades. Una vez que los instalemos en nuestro equipo de desarrollo, tenemos la posibilidad de seleccionar como origen o destino una lista de SharePoint.

ssis_sharepoint_1

Con lo que podemos configurar que información vamos a obtener de SharePoint, transformarla y devolverla al destino o a una tabla en un Data Warehouse.

ssis_sharepoint_2

En el caso que utilicemos el conector de destino para SharePoint, tenemos la opción de elegir si queremos insertar y/o actualizar los datos de la lista, o si lo que queremos es realizar un borrado de aquellas filas que coincidan.

ssis_sharepoint_3

Con estos componentes, podemos utilizar SharePoint como aplicación CRUD donde el usuario introduce información relevante para el Data Warehouse de la compañía y extraer la información, mediante un paquete de integración, para fusionarla con el resto de información que tengamos.

 

Saludos a todos…

Webcast. Charla con los expertos: Todo los que siempre quisiste saber sobre SharePoint, pero no te atreviste a preguntar antes del verano

Para que no nos olvidemos de nuestro servidor favorito mientras disfrutamos del verano, en un terracita con nuestra cerveza vien fría, tenemos una nueva edición del chat con los MVP de SharePoint de habla hispana.

Allí estaremos Gustavo Vélez, David Martos, Ricardo Muñoz, Juan Andrés Valenzuela, Juan Carlos González, Daniel Seara, Héctor Insua, Manuel Herrera, Haarón González, Fabian Imaz, Mario Cortés Flores, Juan Pablo Pussacq Laborde y un servidor.

Será el próximo miércoles 13 de junio a las 15.00 (GMT 00:00).

El enlace de registro es el siguiente:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032513588&Culture=es-ES

Windows 8. Propiedades de las imágenes

Cuando una cámara saca una foto, añade una serie de metadatos o propiedades que definen ciertas características de la imagen. Estos metadatos se basan en la especificación Exif y definen el fabricante del dispositivo con el que se hizo la foto, el modelo, la orientación, la fecha y hora en la que la foto fue tomada, la resolución, la geolocalización, etc.

En Windows 8 tenemos una clase específica, ImageProperties, que nos permite acceder a algunas de esas propiedades, a través de un StorageFile o de un FileInformation.  Veamos como acceder a ellas mediante un StorageFile.

Para obtener una imágen, tenemos que acceder primero a la carpeta, en esta caso vamos a obtener una carpeta específica que se encuentra dentro del PicturesLibrary.

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

StorageFolder folder = await picturesFolder.GetFolderAsync("MVP Summit 2012");

De esa carpeta específica, obtenemos la imagen del StorageFile que queremos mostrar con y sus propiedades:

var picture = await folder.GetFileAsync("WP_000149.jpg");

 

var imageProperties = await m_StorageFile.Properties.GetImagePropertiesAsync();

 

var latitude = imageProperties.Latitude;

var longitude = imageProperties.Longitude;

var manufacturer = imageProperties.CameraManufacturer;

var model = imageProperties.CameraModel;

.....

Windows8.ImageProperties

(la foto fueron las primeras pruebas de resistencia de un tablet con Windows 8 del maestro Gustavo Vélez)

Si necesitamos acceder al resto de propiedades, tenemos el método StorageFile.Properties.RetrievePropertiesAsync que devuelde un Dictionary con las propiedades que necesitemos.

 

Saludos a todos…