SlideShare une entreprise Scribd logo
session fev 2016 Yann Caron (c) 2016 1
Programmation Android
10 - Spatialite
Yann Caron
session fev 2016 Yann Caron (c) 2016 2
Sommaire - Spatialite
 Présentation
 Installation
 Modélisation de base de donnée
 Création de base de donnée
 Spatialite Helper
 Requêtes
 Objets géométriques
 Pour allez plus loin !
session fev 2016 Yann Caron (c) 2016 3
IN01 – Séance 10
Présentation
session fev 2016 Yann Caron (c) 2016 4
Présentation
 Base de donnée Spatiale
 Open source (MPL 1.1, GPL 2, LGPL 2.1)
 Surcouche SQLite
 Originalement prévu pour PC et porté sur Android
 Embarqué
 Créer pour le projet geopaparazzi
 https://github.com/geopaparazzi/libjsqlite-spatialite-
android/wiki
session fev 2016 Yann Caron (c) 2016 5
Présentation
session fev 2016 Yann Caron (c) 2016 6
Fonctionnalités
 Comme SQLite, db contenue dans un fichier
 Limites du File System
 Equi-fonctionnalité avec PostgreSQL + PostGIS
 Quantité de fonctions SQL : http://www.gaia-
gis.it/gaia-sins/spatialite-sql-4.3.0.html
 Support les données géométriques
conformément au standard OGC-SFS
session fev 2016 Yann Caron (c) 2016 7
Présentation
 Portage de Spatialite sur Android
 C++ / JNI
 Compiler depuis les sources :
➔ Nécéssite d'être compilé avec le ndk (native development
kit)
➔ Il faut écrire les classes java associés
 Utilisé dans l'application geopaparazzi :
https://github.com/geopaparazzi/libjsqlite-spatialite-
android
session fev 2016 Yann Caron (c) 2016 8
Spatialite-Database-Driver
 Une bibliothèque Android Spatialite autonome
 Ecrit par Kristina Hager
 Repo git : https://github.com/kristina-
hager/Spatialite-Database-Driver
 Extrait depuis l'application Geopaparazzi pour
en créer une bibliothèque autonome
session fev 2016 Yann Caron (c) 2016 9
IN01 – Séance 10
Installation
session fev 2016 Yann Caron (c) 2016 10
Installation
 Télécharger le repository git :
https://github.com/kristina-hager/Spatialite-
Database-Driver
 Placer la bibliothèque dans le même repertoire
que le projet (bonne pratique pour les
bibliothèques tiers)
session fev 2016 Yann Caron (c) 2016 11
Installation
 Dans le projet cible :
➔ Dans le module app/build.gradle, ajouter la
dépendance vers la bibliothèque
➔ Inclure la bibliothèque dans le setting du projet :
setting.gradle
include ':app', '..:Spatialite-Database-Driver:spatialite-db-driver'
dependencies {
compile project(
':..:Spatialite-Database-Driver:spatialite-db-driver')
}
session fev 2016 Yann Caron (c) 2016 12
Installation
➔ Dans le module app/build.gradle, ajouter la
copie des bibliothèques natives dans la future apk
import com.android.build.gradle.tasks.PackageApplication
task copyNativeLibs(type: Copy) {
from(new File(project(
':..:Spatialite-Database-Driver:spatialite-db-driver').projectDir,
'src/main/java/jniLibs')) {
include 'armeabi/libjsqlite.so'
include 'armeabi-v7a/libjsqlite.so'
include 'x86/libjsqlite.so' // for emulator x86
}
into new File(buildDir, 'native-libs')
}
tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(PackageApplication) { pkgTask ->
// !!!! Nécéssite la version 1.3.1 de gradle
pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
}
session fev 2016 Yann Caron (c) 2016 13
Installation
 Attention, le code ci-dessus n'est pas
compatible avec la version courante de gradle.
Il faut revenir à une version antérieure
➔ Dans le projet app/build.gradle, ajouter la
dépendance vers la bibliothèque
Dependencies {
Classpath 'com.android.tools.build:gradle:1.3.1'
}
session fev 2016 Yann Caron (c) 2016 14
IN01 – Séance 10
Modélisation de base de donnée
session fev 2016 Yann Caron (c) 2016 15
Creation des tables
 Méthodologie et bonne pratique : toujours créer
un MCD (conception) avant de commencer le
developpement
 Traduire le MCD vers le MLD, format qui est
compréhensible dans le SGBDR
 Créer les tables et leurs jointures
 Créer les indexes
 Le “+” spatial, ajouter les colonnes spatiales
session fev 2016 Yann Caron (c) 2016 16
Modélisation
 Divers méthodologies, objet (UML) ou entité-
relation (Merise)
 Deux étapes :
➔ Modélisation : création des entités et relations,
regroupement des attributs
 Grand principe ; éviter la redondance d'information
➔ Normalisation : convertir le model vers la machine
 Les jointures n / n deviennent une table avec 2 Clés étrangères
 Les classes sur-type sous-types sont normalisées
session fev 2016 Yann Caron (c) 2016 17
Exemple de MCD
In charge ofrecord1,1 1,n 1,n 1,1
Forester
FirstName
LastName
Serial
POI
Name
Description
Position
District
Name
Description
Area
Establish a law suite
Date
Position
Person
FirstName
LastName
1,n
1,n
session fev 2016 Yann Caron (c) 2016 18
MLD
Forester
ID : int
FirstName : string
LastName : string
Serial : string
POI
ID : int
ForesterID : int
Name : string
Description : string
Position : point
District
ID : int
ForesterID : int
Name : string
Description : string
Area : polygon
Person
ID : int
FirstName : string
LastName : string
LawSuite
ForesterID : int
PersonID : int
Date : date
Position : pointRelation n / n normalisée
session fev 2016 Yann Caron (c) 2016 19
IN01 – Séance 10
Création de base de donnée
session fev 2016 Yann Caron (c) 2016 20
Spatial MetaData Tables
 A la création de la base de donnée, spatialite
requière des tables systèmes particulières
 Appellées MetaData Tables
 Pour les créer, il faut lancer la fonction :
SELECT InitSpatialMetaData();
session fev 2016 Yann Caron (c) 2016 21
Spatial MetaData Tables
 Quelques exemples de tables MetaData
 spatial_ref_sys : contient les données
EPSG (European Petroleum Survey Group)
 geometry_columns : recense les colonnes
géométrique de la base de donnée
session fev 2016 Yann Caron (c) 2016 22
Exemple de MLD
Forester
ID : int
FirstName : string
LastName : string
Serial : string
POI
ID : int
ForesterID : int
Name : string
Description : string
Position : point
session fev 2016 Yann Caron (c) 2016 23
Création de table
 CREATE TABLE Forester (
ID integer PRIMARY KEY AUTOINCREMENT,
FirstName string NOT NULL,
LastName string NOT NULL,
Serial string NULL
);
Nom de la table
Non nullable
Nullable
Clé primaire
session fev 2016 Yann Caron (c) 2016 24
Création de table
 CREATE TABLE PointOfInterest (
id integer PRIMARY KEY AUTOINCREMENT,
foresterID integer NOT NULL,
name string NOT NULL,
description string,
CONSTRAINT FK_poi_forester
FOREIGN KEY (foresterID)
REFERENCE forester (id)
);
Contrainte clé étrangère
Clé étrangère
session fev 2016 Yann Caron (c) 2016 25
Création d'index
 Les indexes servent à optimiser les
performances de la base de donnée
➔ Sur les jointure : il faut un index sur chaque clé
étrangère
➔ Sur les critères de recherches souvent utilisés
 CREATE INDEX IDX_poi_forester_id ON
PointOfInterest (forester_id);
session fev 2016 Yann Caron (c) 2016 26
Création d'une table géométrique
 Comme Spatialite est une surcouche à SQLite, il
n'existe pas de grammaire native pour crées
des données Géométriques
 Il est donc nécéssaire de procéder en deux
étapes :
➔ La création de la table en SQL
➔ L'ajout de la (des) colonne(s) géométrique(s) :
fonction AddGeometryColumn
session fev 2016 Yann Caron (c) 2016 27
Création de la colonne geometrique
 SELECT
AddGeometryColumn('PointOfInterest'
, 'position', 4326, 'POINT', 'XY',
0);
SRID
Type de géométrie
Nb dimensionsGéométrie Nullable
session fev 2016 Yann Caron (c) 2016 28
Geometry : POINT, MULTIPOINT
 POINT(123.45 543.21)
 MULTIPOINT(1234.56 6543.21, 1 2, 3 4,
65.21 124.78)
Succession de points
session fev 2016 Yann Caron (c) 2016 29
Geometry : LINESTRING
 LINESTRING(100.0 200.0, 201.5
102.5, 1234.56 123.89)
Succession de points
session fev 2016 Yann Caron (c) 2016 30
Geometry : MULTILINESTRING
 MULTILINESTRING((1 2, 3 4), (5 6, 7
8, 9 10), (11 12, 13 14))
Succession de linestrings
session fev 2016 Yann Caron (c) 2016 31
Geometry : POLYGON
 POLYGON((10 10, 20 10, 20 20, 10 20,
10 10), (13 13, 17 13, 17 17, 13 17,
13 13))
Bordure interieure
Bordure extérieure
session fev 2016 Yann Caron (c) 2016 32
Geometry : MULTIPOLYGON
 MULTIPOLYGON(((0 0,10 20,30 40,0 0),(1
1,2 2,3 3,1 1)),
 ((100 100,110 110,120 120,100 100)))
Succession de polygons
session fev 2016 Yann Caron (c) 2016 33
Geometry : GEOMETRYCOLLECTION
 Une succession d'objets géométriques
 Non standard et peu reconnu
 GEOMETRYCOLLECTION(POINT(1 1),
LINESTRING(4 5, 6 7, 8 9), POINT(30
30))
session fev 2016 Yann Caron (c) 2016 34
Dimensions
 Quatre systèmes de dimensions possible
➔ XY : Coordonnées 2D
➔ XYM : Coordonnées 2D + Mesure
➔ XYZ : Coordonnées 3D
➔ XYZM : Coordonnées 3D + Mesure
session fev 2016 Yann Caron (c) 2016 35
Dimensions
 Dont on dérive les géométries
XY XYM XYZ XYZM
POINT POINT M POINT Z POINT ZM
MULTIPOINT MULTIPOINT M MULTIPOINT Z MULTIPOINT ZM
LINESTRING LINESTRING M LINESTRING Z LINESTRING ZM
MULTILINESTRING MULTILINESTRING
M
MULTILINESTRING
Z
MULTILINESTRING
ZM
POLYGON POLYGON M POLYGON Z POLYGON ZM
MULTIPOLYGON MULTIPOLYGON M MULTIPOLYGON Z MULTIPOLYGON
ZM
session fev 2016 Yann Caron (c) 2016 36
IN01 – Séance 10
Spatialite Helper
session fev 2016 Yann Caron (c) 2016 37
Spatialite Helper
 Développé pour le TP
➔ Basé sur SqliteOpenHelper
➔ Prend en charge les MetaData Tables
➔ Facilite la création et la gestion des mises à jour
dans le contexte d'une application Android
➔ Permet de manipuler et comprendre un design
pattern : Template Method
 Propre à l'architecture en couche
session fev 2016 Yann Caron (c) 2016 38
Template Method
 Lorsqu'un méthode concrète d'une classe
abstraite fait appel à des méthodes abstraite de
celle ci
session fev 2016 Yann Caron (c) 2016 39
Spatialite API
Architecture en couche
My ApplicationDelegation
Template method
session fev 2016 Yann Caron (c) 2016 40
SpatialiteOpenHelper
 Créer une classe qui hérite de
SpatialOpenHelper
 Surcharger la méthode onCreate ; en charge
de créer le schema de la base
 Surcharger la méthode onUpgrade ; en charge
de gérer le changement de version de
l'application
 Utiliser la méthode super.exec
session fev 2016 Yann Caron (c) 2016 41
SpatialiteOpenHelper
public class SDBHelper extends SpatialiteOpenHelper {
@Override
public void onCreate(Database db) throws jsqlite.Exception {
// Création du schema
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion)
throws Exception {
// Upgrade
}
}
Lancement à l'installation
Schema complet et à jour
Lorsque l'application est mise à jour par l'utilisateur
session fev 2016 Yann Caron (c) 2016 42
Création du schema
@Override
public void onCreate(Database db) throws jsqlite.Exception {
// Création du schema
super.exec("create table Forester (" +
"id integer PRIMARY KEY AUTOINCREMENT, " +
"firstName string NOT NULL, " +
"lastName string NOT NULL, " +
"serial string NULL);");
super.exec("create table PointOfInterest (" +
"id integer PRIMARY KEY AUTOINCREMENT, " +
"foresterID integer NOT NULL, " +
"name string NOT NULL, " +
"description string, " +
"CONSTRAINT FK_poi_forester " +
"FOREIGN KEY (foresterID) " +
"REFERENCE forester (id) );");
super.exec("CREATE INDEX IDX_poi_forester " +
"ON PointOfInterest (forester_id);");
super.exec("SELECT AddGeometryColumn(" +
"'PointOfInterest', 'position', 4326, 'POINT', 'XY', 0);");
}
session fev 2016 Yann Caron (c) 2016 43
Gestion de la version
 Le numéro de version de la base de donnée est
passé en paramètre au super constructeur
 La super classe abstraite se chargera de gérer
la mise à jour
public MySpatialiteHelper(Context context) throws .... {
super(context, "Spatial.sqlite", 4);
}
session fev 2016 Yann Caron (c) 2016 44
Gestion des mises à jours
 Problématique : que deviens le schema si
l'application est mise à jours par l'utilisateur
 Contrainte : concerver les données déjà saisies
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
// mise à jour de 1 -> 2
// pas de break
case 2:
// mise à jour de 2 -> 3
// pas de break
case 3:
// mise à jour de 3 -> 4
break;
default:
throw new IllegalStateException(
"onUpgrade() with unknown oldVersion" + oldVersion);
}}
Gère les changements
étape par étape
Exécution en cascade
session fev 2016 Yann Caron (c) 2016 45
Mise à jour de l'application
 Si le schema est modifié, il faut ajouter les
requête de création à deux endroits :
➔ OnCreate : pour que les nouveaux utilisateurs aient
le nouveau schéma directement
➔ OnUpdate : ajouter un case au switch et déplacer le
break, pour que les utilisateurs possedant une
ancienne version aient leur schema mis à jour
session fev 2016 Yann Caron (c) 2016 46
IN01 – Séance 10
Requêtes
session fev 2016 Yann Caron (c) 2016 47
WKT / WKB
 WKT : Well known Text, exploitable par un être
humain
 WKB : Well Known Binary, exploitable par la
machine à destination d'import, export et
échanges
 Contre un format de stoquage Spatialite BLOB
Geometry
 Il faut convertir !
session fev 2016 Yann Caron (c) 2016 48
Fonctions de conversions
 ST_GeomFromText : converti WKT vers BLOB
Geometry
➔ SELECT ST_GeomFromText('POINT(1.2345
2.3456)');
 GeomObject
 ST_AsText : converti BLOB Geometry vers WKT
➔ SELECT ST_AsText(x'0001FFFFFFF ... ');
 POINT(1.2345 2.3456)
session fev 2016 Yann Caron (c) 2016 49
Fonctions de conversions
 ST_GeomFromWKB : converti WKB vers BLOB
Geometry
➔ ST_GeomFromWKB(x'010100000 ... ');
 GeomObject
 ST_AsBinary : converti BLOB Geometry vers
WKB
➔ SELECT HEX(ST_AsBinary(x'010100000...'));
 01010000008D976E1283C0F33F16FBCBEEC9C30240
Hexadecimal
session fev 2016 Yann Caron (c) 2016 50
Fonctions utiles
 ST_GeometryType : renvoie le type de
géométrie
➔ SELECT
ST_GeometryType(ST_GeomFromText('POINT
M(1.2345 2.3456)'));
 POINT M
 Attention, les deux syntaxes POINT M et
POINTM sont valides
session fev 2016 Yann Caron (c) 2016 51
Fonctions utiles
 ST_Srid : renvoie le SRID (EPSG) de la valeur
géométrique
➔ SELECT
ST_Srid(ST_GeomFromText('POINT(1.2345
2.3456)', 4326));
 4326
 Attention, à toujours spécifier les SRID de la
géométrie !
session fev 2016 Yann Caron (c) 2016 52
Autres Fonctions
 Informations : spatialite_version, spatialite_target_cpu
 Conversion : CastToMultiLineString, CastToXYZM, CastToXY
 Conversion geographique : LongLatToDMS, LongitudeFromDMS,
LatitudeFromDMS
 Unités : CvtToKm, CvtFromKm, CvtToUsIn, CvtFromUsIn
 Calculs geométriques : ST_Perimeter, ST_Centroid, ST_Area
 Relation géométriques : ST_Overlaps, ST_Intersects,
ST_Contains
 Avancé : eval, AsSVG, AsKml, AsGeoJSON
 Référence : http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html
session fev 2016 Yann Caron (c) 2016 53
Exécuter une requêtes : code
helper.exec(
"insert into " + MySpatialiteHelper.TABLE_SECTOR +
"(" + MySpatialiteHelper.COLUMN_NAME + ", "
+ MySpatialiteHelper.COLUMN_COORDINATE + ")" +
" values ('" + name.getText() + "', '"
+ comment.getText() + "', "
+ shape.toSpatialiteQuery(MySpatialiteHelper.GPS_SRID) + ");");
 S'exécute grâce au helper
 Il faut gérer les exceptions le cas échéant
session fev 2016 Yann Caron (c) 2016 54
jsqlite.stmt
 Pour lire le résultat d'une requête
 Appellé RecordSet ou Statement
 Il faut utiliser la méthode Database.Prepare(sql)
qui renvoie un Stmt
 Itérer avec la méthode stmt.step()
 Récupérer les valeurs typés de chaque élément avec
stmt.column_string(columnId), column_int
etc...
 Gérer les erreurs éventuelles
session fev 2016 Yann Caron (c) 2016 55
Stmt : code
stmt = database.prepare("Select name, description, " +
"ST_asText(coordinate) as coord from PointOfInterest");
while (stmt.step()) {
String name = stmt.column_string(0);
String comment = stmt.column_string(1);
String coordStr = stmt.column_string(2);
Point coord = Point.unMarshall(new StringBuilder(coordStr));
mapFragment.addMarker(coord, name, comment);
}
session fev 2016 Yann Caron (c) 2016 56
Exemple de jointure
 Tous les secteurs d'un garde forestier
➔ SELECT s.Name, AsText(s.Area) FROM Sector s
INNER JOIN forester f ON f.id =
s.foresterID
 Les contraventions bornés dans un temps donné
➔ SELECT ls.Date, f.FirstName FROM LawSuite
ls INNER JOIN forester f ON f.id =
ls.foresterID
WHERE ls.date BETWEEN '2015-01-01' AND
'2015-02-01'
session fev 2016 Yann Caron (c) 2016 57
Spatiale
 Jointure :
➔ SELECT s.name, poi.name from Sector s,
PointOfInterest poi where ST_Contains(s.area,
poi.position)
 Ou (Sql99) :
➔ SELECT s.name, poi.name from Sector s INNER
JOIN PointOfInterest poi ON
ST_Contains(s.area, poi.position)
 Area
➔ SELECT *, ST_Area(area) as 'area' from Sector
session fev 2016 Yann Caron (c) 2016 58
Spatiale
 Le plus petit secteur
➔ SELECT MIN(St_Area(area)) from Sector
 La plus grande distance entre deux points
➔ SELECT MAX(St_Distance(poi1.position,
poi2.position)) from PointOfInterest poi1,
PointOfInterest poi2
session fev 2016 Yann Caron (c) 2016 59
Spatiale
 Multi jointure et jointure spatiale :
➔ SELECT * FROM LawSuite ls
INNER JOIN Sector s ON St_Contains(s.area,
poi.position)
INNER JOIN Forester f ON f.id =
s.foresterId AND f.id = ls.ForesterId
WHERE s.name = 'Fontainbleau'
session fev 2016 Yann Caron (c) 2016 60
IN01 – Séance 10
Objets géométriques
session fev 2016 Yann Caron (c) 2016 61
Présentation
 Librairie conçue pour le TP
 Convertion WKT Objet (unmarshall) et Objet WKT (marshall)→ →
 Idée de base, manipuler des objets plutôt que des chaînes de
caractères
➔ Eviter les erreurs
➔ Bénéficier du typage fort du langage Java
➔ Facile à maintenir
➔ Pas de code tiers dans les couches hautes
➔ Optimiser la concatenation des chaînes de caractères
 Bonne pratique (requêtes Sql)
session fev 2016 Yann Caron (c) 2016 62
Exemple d'utilisation
public void testMarshall() throws Exception {
Polygon polygon = new Polygon();
polygon.addCoordinate(new XY(10, 10));
polygon.addCoordinate(new XY(20, 10));
polygon.addCoordinate(new XY(20, 20));
polygon.addCoordinate(new XY(10, 20));
XYList interior = new XYList(true);
interior.add(new XY(14, 14));
interior.add(new XY(17, 14));
interior.add(new XY(17, 17));
interior.add(new XY(14, 17));
polygon.addInterior(interior);
assertEquals("POLYGON ((10 10, 20 10, 20 20, 10 20, 10 10),
(14 14, 17 14, 17 17, 14 17, 14 14))", polygon.toString());
}
session fev 2016 Yann Caron (c) 2016 63
Parcours en profondeur
Polygon
Interior : XYList
XY XY XY XY
Exteriors : List<XYList>
Exterior1 : XYList
XY XY XY XY
POLYGON (
(10 10, 20 10, 20 20, 10 20, 10 10),
(14 14, 17 14, 17 17, 14 17, 14 14)
)
session fev 2016 Yann Caron (c) 2016 64
Principes
 POO :
➔ Hierarchie de type et Polymorphisme
➔ Hierarchie d'objets ; Design pattern Composite
➔ Une interface commune marshallable
 Algorithmie :
➔ Un parcours en profondeur
➔ Un Recursive Descent Parser
session fev 2016 Yann Caron (c) 2016 65
UML
GeometryCollection
Polygon
Geometry XYXYList
Marshallable
<<interface>>
<<realize>>
<<realize>>
PointLineString
0..*
0..*
1..* 1
<<realize>>
session fev 2016 Yann Caron (c) 2016 66
IN01 – Séance 10
Pour allez plus loin
session fev 2016 Yann Caron (c) 2016 67
ORM
 Object Relational Mapping
➔ Pour Sqlite, il existe un ORM appellé ORM-Lite
➔ Il n'existe pas, à ce jour, d'extenssion spatiale
 Et les raster ?
➔ Il existe librasterlite2 pour la version Windows
➔ Il faudrait le porter sur Android
 Compiler les sources C++
 Créer le mapping JNI
session fev 2016 Yann Caron (c) 2016 68
WebServices
 Spatialite est une base de données embarquée
et mono application / utilisateur
 Idée de mutualiser les données
 Synchronisation avec une base de donnée
centralisée via WebServices (cf. Chapitre 09)
 Exemple : PostGIS / Jax WS / Glassfish
session fev 2016 Yann Caron (c) 2016 69
Fin
 Merci de votre attention
 Des questions ?

Contenu connexe

Tendances

Programmation Android - 01 - Introduction
Programmation Android - 01 - IntroductionProgrammation Android - 01 - Introduction
Programmation Android - 01 - Introduction
Yann Caron
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google map
Yann Caron
 
In01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databasesIn01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databases
Yann Caron
 
In01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapIn01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google map
Yann Caron
 
In01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesIn01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiques
Yann Caron
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancées
Yann Caron
 
In01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIIn01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMI
Yann Caron
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - android
Yann Caron
 
In01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationIn01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publication
Yann Caron
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
Laurent BUNIET
 

Tendances (10)

Programmation Android - 01 - Introduction
Programmation Android - 01 - IntroductionProgrammation Android - 01 - Introduction
Programmation Android - 01 - Introduction
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google map
 
In01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databasesIn01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databases
 
In01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapIn01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google map
 
In01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesIn01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiques
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancées
 
In01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIIn01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMI
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - android
 
In01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationIn01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publication
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
 

Similaire à Programmation Android - 10 - Spatialite

Big Data : Une Introduction
Big Data : Une IntroductionBig Data : Une Introduction
Big Data : Une Introduction
Nicolas OGÉ
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
univalence
 
Dataviz : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...
Dataviz  : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...Dataviz  : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...
Dataviz : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...
Serge Courrier
 
Matinale "Data Science et Machine Learning"
Matinale "Data Science et Machine Learning"Matinale "Data Science et Machine Learning"
Matinale "Data Science et Machine Learning"
Aline Deschamps
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Luc Desruelle
 
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
RainerZaiss
 
Analyse statistique sur DOTA
Analyse statistique sur DOTAAnalyse statistique sur DOTA
Analyse statistique sur DOTA
Banville Julien
 
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Christophe Niel
 
Full Design Of Experiments DOE
Full Design Of Experiments DOEFull Design Of Experiments DOE
Full Design Of Experiments DOE
Nouriddin BEN ZEKRI
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro Edition
Sylvain Wallez
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009
Oslandia
 
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
Bruno Bonnin
 
BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...
BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...
BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...IT-Gatineau2011
 
Pg11 pgday 2018
Pg11 pgday 2018Pg11 pgday 2018
Pg11 pgday 2018
Jean-Christophe Arnu
 
Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...
Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...
Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...
Raoul Kamga
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
Yann Caron
 
Une plateforme moderne pour le groupe SIPA/Ouest-France 
Une plateforme moderne pour le groupe SIPA/Ouest-France Une plateforme moderne pour le groupe SIPA/Ouest-France 
Une plateforme moderne pour le groupe SIPA/Ouest-France 
François-Guillaume Ribreau
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
Publicis Sapient Engineering
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 

Similaire à Programmation Android - 10 - Spatialite (20)

Big Data : Une Introduction
Big Data : Une IntroductionBig Data : Une Introduction
Big Data : Une Introduction
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Dataviz : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...
Dataviz  : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...Dataviz  : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...
Dataviz : quels outils pour quelles visualisations (Serge Courrier) - MAJ (1...
 
Matinale "Data Science et Machine Learning"
Matinale "Data Science et Machine Learning"Matinale "Data Science et Machine Learning"
Matinale "Data Science et Machine Learning"
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...
 
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
 
Presentation
PresentationPresentation
Presentation
 
Analyse statistique sur DOTA
Analyse statistique sur DOTAAnalyse statistique sur DOTA
Analyse statistique sur DOTA
 
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
 
Full Design Of Experiments DOE
Full Design Of Experiments DOEFull Design Of Experiments DOE
Full Design Of Experiments DOE
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro Edition
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009
 
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
 
BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...
BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...
BOUCHARD, D. L’intelligence territoriale à l’ère des tableaux de bord cartogr...
 
Pg11 pgday 2018
Pg11 pgday 2018Pg11 pgday 2018
Pg11 pgday 2018
 
Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...
Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...
Conception de l’outil Robo21-RP et usage de cet outil pour faciliter l’approp...
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
 
Une plateforme moderne pour le groupe SIPA/Ouest-France 
Une plateforme moderne pour le groupe SIPA/Ouest-France Une plateforme moderne pour le groupe SIPA/Ouest-France 
Une plateforme moderne pour le groupe SIPA/Ouest-France 
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 

Plus de Yann Caron

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
Yann Caron
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
Yann Caron
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
Yann Caron
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
Yann Caron
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
Yann Caron
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
Yann Caron
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
Yann Caron
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
Yann Caron
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
Yann Caron
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
Yann Caron
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
Yann Caron
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
Yann Caron
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
Yann Caron
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
Yann Caron
 

Plus de Yann Caron (14)

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
 

Dernier

Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Laurent Speyser
 
Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024
UNITECBordeaux
 
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'universitéDe l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
Université de Franche-Comté
 
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
Horgix
 
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptxPRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
AlbertSmithTambwe
 
Les écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptxLes écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptx
abderrahimbourimi
 
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
OCTO Technology
 

Dernier (7)

Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
 
Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024
 
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'universitéDe l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
 
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
 
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptxPRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
 
Les écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptxLes écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptx
 
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
 

Programmation Android - 10 - Spatialite

  • 1. session fev 2016 Yann Caron (c) 2016 1 Programmation Android 10 - Spatialite Yann Caron
  • 2. session fev 2016 Yann Caron (c) 2016 2 Sommaire - Spatialite  Présentation  Installation  Modélisation de base de donnée  Création de base de donnée  Spatialite Helper  Requêtes  Objets géométriques  Pour allez plus loin !
  • 3. session fev 2016 Yann Caron (c) 2016 3 IN01 – Séance 10 Présentation
  • 4. session fev 2016 Yann Caron (c) 2016 4 Présentation  Base de donnée Spatiale  Open source (MPL 1.1, GPL 2, LGPL 2.1)  Surcouche SQLite  Originalement prévu pour PC et porté sur Android  Embarqué  Créer pour le projet geopaparazzi  https://github.com/geopaparazzi/libjsqlite-spatialite- android/wiki
  • 5. session fev 2016 Yann Caron (c) 2016 5 Présentation
  • 6. session fev 2016 Yann Caron (c) 2016 6 Fonctionnalités  Comme SQLite, db contenue dans un fichier  Limites du File System  Equi-fonctionnalité avec PostgreSQL + PostGIS  Quantité de fonctions SQL : http://www.gaia- gis.it/gaia-sins/spatialite-sql-4.3.0.html  Support les données géométriques conformément au standard OGC-SFS
  • 7. session fev 2016 Yann Caron (c) 2016 7 Présentation  Portage de Spatialite sur Android  C++ / JNI  Compiler depuis les sources : ➔ Nécéssite d'être compilé avec le ndk (native development kit) ➔ Il faut écrire les classes java associés  Utilisé dans l'application geopaparazzi : https://github.com/geopaparazzi/libjsqlite-spatialite- android
  • 8. session fev 2016 Yann Caron (c) 2016 8 Spatialite-Database-Driver  Une bibliothèque Android Spatialite autonome  Ecrit par Kristina Hager  Repo git : https://github.com/kristina- hager/Spatialite-Database-Driver  Extrait depuis l'application Geopaparazzi pour en créer une bibliothèque autonome
  • 9. session fev 2016 Yann Caron (c) 2016 9 IN01 – Séance 10 Installation
  • 10. session fev 2016 Yann Caron (c) 2016 10 Installation  Télécharger le repository git : https://github.com/kristina-hager/Spatialite- Database-Driver  Placer la bibliothèque dans le même repertoire que le projet (bonne pratique pour les bibliothèques tiers)
  • 11. session fev 2016 Yann Caron (c) 2016 11 Installation  Dans le projet cible : ➔ Dans le module app/build.gradle, ajouter la dépendance vers la bibliothèque ➔ Inclure la bibliothèque dans le setting du projet : setting.gradle include ':app', '..:Spatialite-Database-Driver:spatialite-db-driver' dependencies { compile project( ':..:Spatialite-Database-Driver:spatialite-db-driver') }
  • 12. session fev 2016 Yann Caron (c) 2016 12 Installation ➔ Dans le module app/build.gradle, ajouter la copie des bibliothèques natives dans la future apk import com.android.build.gradle.tasks.PackageApplication task copyNativeLibs(type: Copy) { from(new File(project( ':..:Spatialite-Database-Driver:spatialite-db-driver').projectDir, 'src/main/java/jniLibs')) { include 'armeabi/libjsqlite.so' include 'armeabi-v7a/libjsqlite.so' include 'x86/libjsqlite.so' // for emulator x86 } into new File(buildDir, 'native-libs') } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyNativeLibs } clean.dependsOn 'cleanCopyNativeLibs' tasks.withType(PackageApplication) { pkgTask -> // !!!! Nécéssite la version 1.3.1 de gradle pkgTask.jniFolders = new HashSet<File>() pkgTask.jniFolders.add(new File(buildDir, 'native-libs')) }
  • 13. session fev 2016 Yann Caron (c) 2016 13 Installation  Attention, le code ci-dessus n'est pas compatible avec la version courante de gradle. Il faut revenir à une version antérieure ➔ Dans le projet app/build.gradle, ajouter la dépendance vers la bibliothèque Dependencies { Classpath 'com.android.tools.build:gradle:1.3.1' }
  • 14. session fev 2016 Yann Caron (c) 2016 14 IN01 – Séance 10 Modélisation de base de donnée
  • 15. session fev 2016 Yann Caron (c) 2016 15 Creation des tables  Méthodologie et bonne pratique : toujours créer un MCD (conception) avant de commencer le developpement  Traduire le MCD vers le MLD, format qui est compréhensible dans le SGBDR  Créer les tables et leurs jointures  Créer les indexes  Le “+” spatial, ajouter les colonnes spatiales
  • 16. session fev 2016 Yann Caron (c) 2016 16 Modélisation  Divers méthodologies, objet (UML) ou entité- relation (Merise)  Deux étapes : ➔ Modélisation : création des entités et relations, regroupement des attributs  Grand principe ; éviter la redondance d'information ➔ Normalisation : convertir le model vers la machine  Les jointures n / n deviennent une table avec 2 Clés étrangères  Les classes sur-type sous-types sont normalisées
  • 17. session fev 2016 Yann Caron (c) 2016 17 Exemple de MCD In charge ofrecord1,1 1,n 1,n 1,1 Forester FirstName LastName Serial POI Name Description Position District Name Description Area Establish a law suite Date Position Person FirstName LastName 1,n 1,n
  • 18. session fev 2016 Yann Caron (c) 2016 18 MLD Forester ID : int FirstName : string LastName : string Serial : string POI ID : int ForesterID : int Name : string Description : string Position : point District ID : int ForesterID : int Name : string Description : string Area : polygon Person ID : int FirstName : string LastName : string LawSuite ForesterID : int PersonID : int Date : date Position : pointRelation n / n normalisée
  • 19. session fev 2016 Yann Caron (c) 2016 19 IN01 – Séance 10 Création de base de donnée
  • 20. session fev 2016 Yann Caron (c) 2016 20 Spatial MetaData Tables  A la création de la base de donnée, spatialite requière des tables systèmes particulières  Appellées MetaData Tables  Pour les créer, il faut lancer la fonction : SELECT InitSpatialMetaData();
  • 21. session fev 2016 Yann Caron (c) 2016 21 Spatial MetaData Tables  Quelques exemples de tables MetaData  spatial_ref_sys : contient les données EPSG (European Petroleum Survey Group)  geometry_columns : recense les colonnes géométrique de la base de donnée
  • 22. session fev 2016 Yann Caron (c) 2016 22 Exemple de MLD Forester ID : int FirstName : string LastName : string Serial : string POI ID : int ForesterID : int Name : string Description : string Position : point
  • 23. session fev 2016 Yann Caron (c) 2016 23 Création de table  CREATE TABLE Forester ( ID integer PRIMARY KEY AUTOINCREMENT, FirstName string NOT NULL, LastName string NOT NULL, Serial string NULL ); Nom de la table Non nullable Nullable Clé primaire
  • 24. session fev 2016 Yann Caron (c) 2016 24 Création de table  CREATE TABLE PointOfInterest ( id integer PRIMARY KEY AUTOINCREMENT, foresterID integer NOT NULL, name string NOT NULL, description string, CONSTRAINT FK_poi_forester FOREIGN KEY (foresterID) REFERENCE forester (id) ); Contrainte clé étrangère Clé étrangère
  • 25. session fev 2016 Yann Caron (c) 2016 25 Création d'index  Les indexes servent à optimiser les performances de la base de donnée ➔ Sur les jointure : il faut un index sur chaque clé étrangère ➔ Sur les critères de recherches souvent utilisés  CREATE INDEX IDX_poi_forester_id ON PointOfInterest (forester_id);
  • 26. session fev 2016 Yann Caron (c) 2016 26 Création d'une table géométrique  Comme Spatialite est une surcouche à SQLite, il n'existe pas de grammaire native pour crées des données Géométriques  Il est donc nécéssaire de procéder en deux étapes : ➔ La création de la table en SQL ➔ L'ajout de la (des) colonne(s) géométrique(s) : fonction AddGeometryColumn
  • 27. session fev 2016 Yann Caron (c) 2016 27 Création de la colonne geometrique  SELECT AddGeometryColumn('PointOfInterest' , 'position', 4326, 'POINT', 'XY', 0); SRID Type de géométrie Nb dimensionsGéométrie Nullable
  • 28. session fev 2016 Yann Caron (c) 2016 28 Geometry : POINT, MULTIPOINT  POINT(123.45 543.21)  MULTIPOINT(1234.56 6543.21, 1 2, 3 4, 65.21 124.78) Succession de points
  • 29. session fev 2016 Yann Caron (c) 2016 29 Geometry : LINESTRING  LINESTRING(100.0 200.0, 201.5 102.5, 1234.56 123.89) Succession de points
  • 30. session fev 2016 Yann Caron (c) 2016 30 Geometry : MULTILINESTRING  MULTILINESTRING((1 2, 3 4), (5 6, 7 8, 9 10), (11 12, 13 14)) Succession de linestrings
  • 31. session fev 2016 Yann Caron (c) 2016 31 Geometry : POLYGON  POLYGON((10 10, 20 10, 20 20, 10 20, 10 10), (13 13, 17 13, 17 17, 13 17, 13 13)) Bordure interieure Bordure extérieure
  • 32. session fev 2016 Yann Caron (c) 2016 32 Geometry : MULTIPOLYGON  MULTIPOLYGON(((0 0,10 20,30 40,0 0),(1 1,2 2,3 3,1 1)),  ((100 100,110 110,120 120,100 100))) Succession de polygons
  • 33. session fev 2016 Yann Caron (c) 2016 33 Geometry : GEOMETRYCOLLECTION  Une succession d'objets géométriques  Non standard et peu reconnu  GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(4 5, 6 7, 8 9), POINT(30 30))
  • 34. session fev 2016 Yann Caron (c) 2016 34 Dimensions  Quatre systèmes de dimensions possible ➔ XY : Coordonnées 2D ➔ XYM : Coordonnées 2D + Mesure ➔ XYZ : Coordonnées 3D ➔ XYZM : Coordonnées 3D + Mesure
  • 35. session fev 2016 Yann Caron (c) 2016 35 Dimensions  Dont on dérive les géométries XY XYM XYZ XYZM POINT POINT M POINT Z POINT ZM MULTIPOINT MULTIPOINT M MULTIPOINT Z MULTIPOINT ZM LINESTRING LINESTRING M LINESTRING Z LINESTRING ZM MULTILINESTRING MULTILINESTRING M MULTILINESTRING Z MULTILINESTRING ZM POLYGON POLYGON M POLYGON Z POLYGON ZM MULTIPOLYGON MULTIPOLYGON M MULTIPOLYGON Z MULTIPOLYGON ZM
  • 36. session fev 2016 Yann Caron (c) 2016 36 IN01 – Séance 10 Spatialite Helper
  • 37. session fev 2016 Yann Caron (c) 2016 37 Spatialite Helper  Développé pour le TP ➔ Basé sur SqliteOpenHelper ➔ Prend en charge les MetaData Tables ➔ Facilite la création et la gestion des mises à jour dans le contexte d'une application Android ➔ Permet de manipuler et comprendre un design pattern : Template Method  Propre à l'architecture en couche
  • 38. session fev 2016 Yann Caron (c) 2016 38 Template Method  Lorsqu'un méthode concrète d'une classe abstraite fait appel à des méthodes abstraite de celle ci
  • 39. session fev 2016 Yann Caron (c) 2016 39 Spatialite API Architecture en couche My ApplicationDelegation Template method
  • 40. session fev 2016 Yann Caron (c) 2016 40 SpatialiteOpenHelper  Créer une classe qui hérite de SpatialOpenHelper  Surcharger la méthode onCreate ; en charge de créer le schema de la base  Surcharger la méthode onUpgrade ; en charge de gérer le changement de version de l'application  Utiliser la méthode super.exec
  • 41. session fev 2016 Yann Caron (c) 2016 41 SpatialiteOpenHelper public class SDBHelper extends SpatialiteOpenHelper { @Override public void onCreate(Database db) throws jsqlite.Exception { // Création du schema } @Override public void onUpgrade(Database db, int oldVersion, int newVersion) throws Exception { // Upgrade } } Lancement à l'installation Schema complet et à jour Lorsque l'application est mise à jour par l'utilisateur
  • 42. session fev 2016 Yann Caron (c) 2016 42 Création du schema @Override public void onCreate(Database db) throws jsqlite.Exception { // Création du schema super.exec("create table Forester (" + "id integer PRIMARY KEY AUTOINCREMENT, " + "firstName string NOT NULL, " + "lastName string NOT NULL, " + "serial string NULL);"); super.exec("create table PointOfInterest (" + "id integer PRIMARY KEY AUTOINCREMENT, " + "foresterID integer NOT NULL, " + "name string NOT NULL, " + "description string, " + "CONSTRAINT FK_poi_forester " + "FOREIGN KEY (foresterID) " + "REFERENCE forester (id) );"); super.exec("CREATE INDEX IDX_poi_forester " + "ON PointOfInterest (forester_id);"); super.exec("SELECT AddGeometryColumn(" + "'PointOfInterest', 'position', 4326, 'POINT', 'XY', 0);"); }
  • 43. session fev 2016 Yann Caron (c) 2016 43 Gestion de la version  Le numéro de version de la base de donnée est passé en paramètre au super constructeur  La super classe abstraite se chargera de gérer la mise à jour public MySpatialiteHelper(Context context) throws .... { super(context, "Spatial.sqlite", 4); }
  • 44. session fev 2016 Yann Caron (c) 2016 44 Gestion des mises à jours  Problématique : que deviens le schema si l'application est mise à jours par l'utilisateur  Contrainte : concerver les données déjà saisies @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { switch(oldVersion) { case 1: // mise à jour de 1 -> 2 // pas de break case 2: // mise à jour de 2 -> 3 // pas de break case 3: // mise à jour de 3 -> 4 break; default: throw new IllegalStateException( "onUpgrade() with unknown oldVersion" + oldVersion); }} Gère les changements étape par étape Exécution en cascade
  • 45. session fev 2016 Yann Caron (c) 2016 45 Mise à jour de l'application  Si le schema est modifié, il faut ajouter les requête de création à deux endroits : ➔ OnCreate : pour que les nouveaux utilisateurs aient le nouveau schéma directement ➔ OnUpdate : ajouter un case au switch et déplacer le break, pour que les utilisateurs possedant une ancienne version aient leur schema mis à jour
  • 46. session fev 2016 Yann Caron (c) 2016 46 IN01 – Séance 10 Requêtes
  • 47. session fev 2016 Yann Caron (c) 2016 47 WKT / WKB  WKT : Well known Text, exploitable par un être humain  WKB : Well Known Binary, exploitable par la machine à destination d'import, export et échanges  Contre un format de stoquage Spatialite BLOB Geometry  Il faut convertir !
  • 48. session fev 2016 Yann Caron (c) 2016 48 Fonctions de conversions  ST_GeomFromText : converti WKT vers BLOB Geometry ➔ SELECT ST_GeomFromText('POINT(1.2345 2.3456)');  GeomObject  ST_AsText : converti BLOB Geometry vers WKT ➔ SELECT ST_AsText(x'0001FFFFFFF ... ');  POINT(1.2345 2.3456)
  • 49. session fev 2016 Yann Caron (c) 2016 49 Fonctions de conversions  ST_GeomFromWKB : converti WKB vers BLOB Geometry ➔ ST_GeomFromWKB(x'010100000 ... ');  GeomObject  ST_AsBinary : converti BLOB Geometry vers WKB ➔ SELECT HEX(ST_AsBinary(x'010100000...'));  01010000008D976E1283C0F33F16FBCBEEC9C30240 Hexadecimal
  • 50. session fev 2016 Yann Caron (c) 2016 50 Fonctions utiles  ST_GeometryType : renvoie le type de géométrie ➔ SELECT ST_GeometryType(ST_GeomFromText('POINT M(1.2345 2.3456)'));  POINT M  Attention, les deux syntaxes POINT M et POINTM sont valides
  • 51. session fev 2016 Yann Caron (c) 2016 51 Fonctions utiles  ST_Srid : renvoie le SRID (EPSG) de la valeur géométrique ➔ SELECT ST_Srid(ST_GeomFromText('POINT(1.2345 2.3456)', 4326));  4326  Attention, à toujours spécifier les SRID de la géométrie !
  • 52. session fev 2016 Yann Caron (c) 2016 52 Autres Fonctions  Informations : spatialite_version, spatialite_target_cpu  Conversion : CastToMultiLineString, CastToXYZM, CastToXY  Conversion geographique : LongLatToDMS, LongitudeFromDMS, LatitudeFromDMS  Unités : CvtToKm, CvtFromKm, CvtToUsIn, CvtFromUsIn  Calculs geométriques : ST_Perimeter, ST_Centroid, ST_Area  Relation géométriques : ST_Overlaps, ST_Intersects, ST_Contains  Avancé : eval, AsSVG, AsKml, AsGeoJSON  Référence : http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html
  • 53. session fev 2016 Yann Caron (c) 2016 53 Exécuter une requêtes : code helper.exec( "insert into " + MySpatialiteHelper.TABLE_SECTOR + "(" + MySpatialiteHelper.COLUMN_NAME + ", " + MySpatialiteHelper.COLUMN_COORDINATE + ")" + " values ('" + name.getText() + "', '" + comment.getText() + "', " + shape.toSpatialiteQuery(MySpatialiteHelper.GPS_SRID) + ");");  S'exécute grâce au helper  Il faut gérer les exceptions le cas échéant
  • 54. session fev 2016 Yann Caron (c) 2016 54 jsqlite.stmt  Pour lire le résultat d'une requête  Appellé RecordSet ou Statement  Il faut utiliser la méthode Database.Prepare(sql) qui renvoie un Stmt  Itérer avec la méthode stmt.step()  Récupérer les valeurs typés de chaque élément avec stmt.column_string(columnId), column_int etc...  Gérer les erreurs éventuelles
  • 55. session fev 2016 Yann Caron (c) 2016 55 Stmt : code stmt = database.prepare("Select name, description, " + "ST_asText(coordinate) as coord from PointOfInterest"); while (stmt.step()) { String name = stmt.column_string(0); String comment = stmt.column_string(1); String coordStr = stmt.column_string(2); Point coord = Point.unMarshall(new StringBuilder(coordStr)); mapFragment.addMarker(coord, name, comment); }
  • 56. session fev 2016 Yann Caron (c) 2016 56 Exemple de jointure  Tous les secteurs d'un garde forestier ➔ SELECT s.Name, AsText(s.Area) FROM Sector s INNER JOIN forester f ON f.id = s.foresterID  Les contraventions bornés dans un temps donné ➔ SELECT ls.Date, f.FirstName FROM LawSuite ls INNER JOIN forester f ON f.id = ls.foresterID WHERE ls.date BETWEEN '2015-01-01' AND '2015-02-01'
  • 57. session fev 2016 Yann Caron (c) 2016 57 Spatiale  Jointure : ➔ SELECT s.name, poi.name from Sector s, PointOfInterest poi where ST_Contains(s.area, poi.position)  Ou (Sql99) : ➔ SELECT s.name, poi.name from Sector s INNER JOIN PointOfInterest poi ON ST_Contains(s.area, poi.position)  Area ➔ SELECT *, ST_Area(area) as 'area' from Sector
  • 58. session fev 2016 Yann Caron (c) 2016 58 Spatiale  Le plus petit secteur ➔ SELECT MIN(St_Area(area)) from Sector  La plus grande distance entre deux points ➔ SELECT MAX(St_Distance(poi1.position, poi2.position)) from PointOfInterest poi1, PointOfInterest poi2
  • 59. session fev 2016 Yann Caron (c) 2016 59 Spatiale  Multi jointure et jointure spatiale : ➔ SELECT * FROM LawSuite ls INNER JOIN Sector s ON St_Contains(s.area, poi.position) INNER JOIN Forester f ON f.id = s.foresterId AND f.id = ls.ForesterId WHERE s.name = 'Fontainbleau'
  • 60. session fev 2016 Yann Caron (c) 2016 60 IN01 – Séance 10 Objets géométriques
  • 61. session fev 2016 Yann Caron (c) 2016 61 Présentation  Librairie conçue pour le TP  Convertion WKT Objet (unmarshall) et Objet WKT (marshall)→ →  Idée de base, manipuler des objets plutôt que des chaînes de caractères ➔ Eviter les erreurs ➔ Bénéficier du typage fort du langage Java ➔ Facile à maintenir ➔ Pas de code tiers dans les couches hautes ➔ Optimiser la concatenation des chaînes de caractères  Bonne pratique (requêtes Sql)
  • 62. session fev 2016 Yann Caron (c) 2016 62 Exemple d'utilisation public void testMarshall() throws Exception { Polygon polygon = new Polygon(); polygon.addCoordinate(new XY(10, 10)); polygon.addCoordinate(new XY(20, 10)); polygon.addCoordinate(new XY(20, 20)); polygon.addCoordinate(new XY(10, 20)); XYList interior = new XYList(true); interior.add(new XY(14, 14)); interior.add(new XY(17, 14)); interior.add(new XY(17, 17)); interior.add(new XY(14, 17)); polygon.addInterior(interior); assertEquals("POLYGON ((10 10, 20 10, 20 20, 10 20, 10 10), (14 14, 17 14, 17 17, 14 17, 14 14))", polygon.toString()); }
  • 63. session fev 2016 Yann Caron (c) 2016 63 Parcours en profondeur Polygon Interior : XYList XY XY XY XY Exteriors : List<XYList> Exterior1 : XYList XY XY XY XY POLYGON ( (10 10, 20 10, 20 20, 10 20, 10 10), (14 14, 17 14, 17 17, 14 17, 14 14) )
  • 64. session fev 2016 Yann Caron (c) 2016 64 Principes  POO : ➔ Hierarchie de type et Polymorphisme ➔ Hierarchie d'objets ; Design pattern Composite ➔ Une interface commune marshallable  Algorithmie : ➔ Un parcours en profondeur ➔ Un Recursive Descent Parser
  • 65. session fev 2016 Yann Caron (c) 2016 65 UML GeometryCollection Polygon Geometry XYXYList Marshallable <<interface>> <<realize>> <<realize>> PointLineString 0..* 0..* 1..* 1 <<realize>>
  • 66. session fev 2016 Yann Caron (c) 2016 66 IN01 – Séance 10 Pour allez plus loin
  • 67. session fev 2016 Yann Caron (c) 2016 67 ORM  Object Relational Mapping ➔ Pour Sqlite, il existe un ORM appellé ORM-Lite ➔ Il n'existe pas, à ce jour, d'extenssion spatiale  Et les raster ? ➔ Il existe librasterlite2 pour la version Windows ➔ Il faudrait le porter sur Android  Compiler les sources C++  Créer le mapping JNI
  • 68. session fev 2016 Yann Caron (c) 2016 68 WebServices  Spatialite est une base de données embarquée et mono application / utilisateur  Idée de mutualiser les données  Synchronisation avec une base de donnée centralisée via WebServices (cf. Chapitre 09)  Exemple : PostGIS / Jax WS / Glassfish
  • 69. session fev 2016 Yann Caron (c) 2016 69 Fin  Merci de votre attention  Des questions ?