SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
GeoSpatial Graphs
made easy with
Luigi Dell’Aquila
Prague, 20-21 October 2016
Luigi Dell’Aquila
Core Developer and Director of Consulting
OrientDB LTD
Twitter: @ldellaquila
http://www.orientdb.com
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Our goal
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Summary
•What is OrientDB
•OrientDB GeoSpatial API
•Importing Geo data (Node.js)
•Querying Geo data (OrientDB Studio)
•Displaying Geo data (Angular2, Google Maps)
•Adding Relationships - graph data
•Graph + Spatial queries
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
What is OrientDB
•Multi-Model Database (Document, Graph and more)
•Tables Classes
•Extended SQL
•JOIN Physical Pointers
•Schema, No-Schema, Hybrid
•HTTP + Binary protocols
•Stand-alone or Embedded
•Distributed Multi-Master
•Apache 2 license
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Install
•http://www.orientdb.com/download/
•http://central.maven.org/maven2/com/
orientechnologies/orientdb-spatial/VERSION/
orientdb-spatial-VERSION-dist.jar
> cd orientdb-community/bin/
> ./server.sh
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
OrientDB GeoSpatial Classes
•OPoint
•OLine
•OPolygon
•OMultiPoint
•OMultiline
•OMultiPlygon
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
OrientDB GeoSpatial Functions
•ST_GeomFromText(text)
•ST_Equals(geom, geom)
•ST_Contains(geom, geom)
•ST_Disjoint(geom, geom)
•ST_Intersects(geom, geom)
•ST_Distance_Sphere(geom, geom)
•and more…
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Our Data Model
CREATE CLASS POI EXTENDS V
CREATE PROPERTY POI.location EMBEDDED OPoint
CREATE INDEX POI.location on POI(location) SPATIAL ENGINE LUCENE
CREATE CLASS Natural EXTENDS V
CREATE PROPERTY Natural.location EMBEDDED OPolygon
CREATE INDEX Natural.location on Natural(location) SPATIAL ENGINE LUCENE
CREATE CLASS Person EXTENDS V
CREATE PROPERTY Person.location EMBEDDED OPoint
CREATE CLASS FriendOf EXTENDS E
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Our Data Source (WKT)
WKT,osm_id,name,type
"POINT (14.4641804 50.0972109)",24569342,"Invalidovna, Metro B",station
"POINT (14.4739792 50.1036789)",24569358,"Palmovka, Metro B",station
"POINT (14.4921863 50.1062907)",24569412,"Českomoravská, Metro B",station
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Now let’s import data!
> npm init
> npm install orientjs
> npm install fast-csv
> touch index.js
import files
http://www.mapcruzin.com/free-czech-republic-maps.htm
(convert to WKT using QGis)
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Dependencies
var fs = require("fs")

var ODatabase = require("orientjs").ODatabase

var csv = require("fast-csv")
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Read from CSV
var stream = fs.createReadStream("data/poland-poi.csv");



var csvStream = csv.parse({headers: true})

.on("data", function(data){

console.log(data)

})

.on("end", function(){

console.log("Done!")

});



stream.pipe(csvStream);


Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
DB connection
var db = new ODatabase({

host: "localhost",

port: 2424,

username: "admin",

password: "admin",

name: "geo"

})
db.open().then(function(){

}


Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Insert
var insertElement = function(data){

db.insert().into(className).set(

{

name: data.name,

type: data.type,

location: db.rawExpression("ST_GeomFromText('"+data.WKT+"')")

}

).one().then(function(){})

}


Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Is it done?
Not yet :-(
Node.js… asynchronous… promises…
Final version:
https://github.com/luigidellaquila/wkt-to-orient
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Querying geo data
We are here:
(50.10902, 14.5831653)
(lat, lon)
Front-End!
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Clone the scaffolding
> git clone https://github.com/luigidellaquila/geospatial-demo
> git checkout warsaw_demo_step0
> cd geospatial-demo
> npm install
(it’s a clone of https://github.com/angular/quickstart)
> npm start
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Clone the scaffolding
> git clone https://github.com/luigidellaquila/geospatial-demo
> git checkout warsaw_demo_step0
> cd geospatial-demo
> npm install
(it’s a clone of https://github.com/angular/quickstart)
> npm start
> cd <orientdb-home>/www
> ln -s <quickstart-path>
> tsc -w
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
We need Google Maps
<script src=“https://maps.googleapis.com/maps/api/js?key=API_KEY"

async defer></script>
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Let’s display a map (app.html)
<div class=“container">

<div class="row">

<div class="col-md-12" id="map" style=“height:600px"></div>

</div>

</div>
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Draw the map
drawMap(){

var controller = this;

let mapProp = {

center: new google.maps.LatLng(52.231807953759706, 21.013154983520508),

zoom: 16,

mapTypeId: google.maps.MapTypeId.ROADMAP

};



controller.map = new google.maps.Map(document.getElementById("map"), mapProp);

controller.map.addListener("click", function(point: any){

controller.zone.run(()=> {

controller.lat = point.latLng.lat();

controller.lon = point.latLng.lng();

});

});

}
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Create a Person
createPerson(): void{

var location = {

// the location object

}



var queryString = ””; // OrientDB statement



this.orient.command(
queryString,
(result) => { /* Success callback */ },
(error) => { /* Error callback */ }
);

}

Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Create a Person
createPerson(): void{

var location = {

"@class": "OPoint",

coordinates: [this.lon, this.lat]

}



var queryString = ””; // OrientDB statement



this.orient.command(
queryString,
(result) => { /* Success callback */ },
(error) => { /* Error callback */ }
);}

Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Create a Person
createPerson(): void{

var location = {

"@class": "OPoint",

coordinates: [this.lon, this.lat]

}



var queryString = `insert into Person 

set name = '${this.personName}', 

location = ${JSON.stringify(location)}`;



this.orient.command(
queryString,
(result) => { /* Success callback */ },
(error) => { /* Error callback */ }
);

}

Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Create a Person
createPerson(): void{

var location = {

"@class": "OPoint",

coordinates: [this.lon, this.lat]

}



var queryString = `insert into Person 

set name = '${this.personName}', 

location = ${JSON.stringify(location)}`;



this.orient.command(
queryString,
(res) => {

let body = res.json();

let person = body.result[0];

this.addPersonToMap(person)

},
(e) => { console.log(e) });

}

Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Add Person Vertex to Orient via REST API
command(statement: string, success: (data: any) => void, error: (err: any) => void): void{

var url = this.url + "sql/-/-1"


var headers = new Headers();

headers.append("Authorization", "Basic " + btoa(this.username+":"+this.password));



this.http.post( // HTTP POST

url, // the URL

JSON.stringify({

"command": statement // the SQL command

}),

{headers: headers} // the authentication data

).toPromise()

.then(success)

.catch(error);

}
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Add Person to the Map
addPersonToMap(personData:any){

let location = personData.location;

let coordinates = location.coordinates;

let controller = this;

let marker = new google.maps.Marker({

position: {lat:coordinates[1], lng:coordinates[0]},

map: this.map,

title: personData.name,

rid: personData["@rid"]

});

google.maps.event.addListener(marker, 'click', function() {

controller.onMarkerClick(marker);

});

}
Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016
Add an edge between people
(FriendOf)
createEdge(from:any, to:any): void{

this.orient.command(

`create edge FriendOf from ${from.rid} to ${to.rid}`,

(x)=>{console.log(x)},

(x)=>{console.log(x)}

)

this.addEdgeBetweenMarkersToMap(from, to);

}
Query the
Geospatial Graph
(DEMO)
Thank you!

Weitere ähnliche Inhalte

Was ist angesagt?

Spark SQL - 10 Things You Need to Know
Spark SQL - 10 Things You Need to KnowSpark SQL - 10 Things You Need to Know
Spark SQL - 10 Things You Need to Know
Kristian Alexander
 

Was ist angesagt? (11)

SFScon 2020 - Peter Hopfgartner - Open Data de luxe
SFScon 2020 - Peter Hopfgartner - Open Data de luxeSFScon 2020 - Peter Hopfgartner - Open Data de luxe
SFScon 2020 - Peter Hopfgartner - Open Data de luxe
 
Akka stream and Akka CQRS
Akka stream and  Akka CQRSAkka stream and  Akka CQRS
Akka stream and Akka CQRS
 
Jena University Talk 2016.03.09 -- SQL at Zalando Technology
Jena University Talk 2016.03.09 -- SQL at Zalando TechnologyJena University Talk 2016.03.09 -- SQL at Zalando Technology
Jena University Talk 2016.03.09 -- SQL at Zalando Technology
 
OrientDB - the 2nd generation of (Multi-Model) NoSQL - Devoxx Belgium 2015
OrientDB - the 2nd generation  of  (Multi-Model) NoSQL - Devoxx Belgium 2015OrientDB - the 2nd generation  of  (Multi-Model) NoSQL - Devoxx Belgium 2015
OrientDB - the 2nd generation of (Multi-Model) NoSQL - Devoxx Belgium 2015
 
Utilising the data attribute
Utilising the data attributeUtilising the data attribute
Utilising the data attribute
 
Codemotion akka persistence, cqrs%2 fes y otras siglas del montón
Codemotion   akka persistence, cqrs%2 fes y otras siglas del montónCodemotion   akka persistence, cqrs%2 fes y otras siglas del montón
Codemotion akka persistence, cqrs%2 fes y otras siglas del montón
 
Spark SQL - 10 Things You Need to Know
Spark SQL - 10 Things You Need to KnowSpark SQL - 10 Things You Need to Know
Spark SQL - 10 Things You Need to Know
 
OrientDB - the 2nd generation of (Multi-Model) NoSQL - J On The Beach 2016
OrientDB - the 2nd generation of (Multi-Model) NoSQL  - J On The Beach 2016OrientDB - the 2nd generation of (Multi-Model) NoSQL  - J On The Beach 2016
OrientDB - the 2nd generation of (Multi-Model) NoSQL - J On The Beach 2016
 
Spark Your Legacy (Spark Summit 2016)
Spark Your Legacy (Spark Summit 2016)Spark Your Legacy (Spark Summit 2016)
Spark Your Legacy (Spark Summit 2016)
 
Big Data processing with Spark, Scala or Java?
Big Data processing with Spark, Scala or Java?Big Data processing with Spark, Scala or Java?
Big Data processing with Spark, Scala or Java?
 
Introduction to interactive data visualisation using R Shiny
Introduction to interactive data visualisation using R ShinyIntroduction to interactive data visualisation using R Shiny
Introduction to interactive data visualisation using R Shiny
 

Ähnlich wie GeeCON Prague 2016 - Geospatial Graphs made easy with OrientDB

Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4
MongoDB
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
JavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development ExperiencesJavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development Experiences
Peter Pilgrim
 
WebSocket JSON Hackday
WebSocket JSON HackdayWebSocket JSON Hackday
WebSocket JSON Hackday
Somay Nakhal
 
Hd insight programming
Hd insight programmingHd insight programming
Hd insight programming
Casear Chu
 

Ähnlich wie GeeCON Prague 2016 - Geospatial Graphs made easy with OrientDB (20)

Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
 
OSCON 2011 CouchApps
OSCON 2011 CouchAppsOSCON 2011 CouchApps
OSCON 2011 CouchApps
 
CouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourCouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 Hour
 
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
 
Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4
 
CARTO ENGINE
CARTO ENGINECARTO ENGINE
CARTO ENGINE
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
 
JavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development ExperiencesJavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development Experiences
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
Visualizing Web Data Query Results
Visualizing Web Data Query ResultsVisualizing Web Data Query Results
Visualizing Web Data Query Results
 
WWW2012 Tutorial Visualizing SPARQL Queries
WWW2012 Tutorial Visualizing SPARQL QueriesWWW2012 Tutorial Visualizing SPARQL Queries
WWW2012 Tutorial Visualizing SPARQL Queries
 
SDKs, the good the bad the ugly - Japan
SDKs, the good the bad the ugly - JapanSDKs, the good the bad the ugly - Japan
SDKs, the good the bad the ugly - Japan
 
WebSocket JSON Hackday
WebSocket JSON HackdayWebSocket JSON Hackday
WebSocket JSON Hackday
 
D3 Mapping Visualization
D3 Mapping VisualizationD3 Mapping Visualization
D3 Mapping Visualization
 
Hd insight programming
Hd insight programmingHd insight programming
Hd insight programming
 
Kill the DBA
Kill the DBAKill the DBA
Kill the DBA
 
2014 bigdatacamp asya_kamsky
2014 bigdatacamp asya_kamsky2014 bigdatacamp asya_kamsky
2014 bigdatacamp asya_kamsky
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
 
Lasso and Couchdb : the happy couple
Lasso and Couchdb : the happy coupleLasso and Couchdb : the happy couple
Lasso and Couchdb : the happy couple
 
My way to clean android (EN) - Android day salamanca edition
My way to clean android (EN) - Android day salamanca editionMy way to clean android (EN) - Android day salamanca edition
My way to clean android (EN) - Android day salamanca edition
 

Mehr von Luigi Dell'Aquila

Mehr von Luigi Dell'Aquila (8)

OrientDB - Voxxed Days Berlin 2016
OrientDB - Voxxed Days Berlin 2016OrientDB - Voxxed Days Berlin 2016
OrientDB - Voxxed Days Berlin 2016
 
OrientDB - Voxxed Days Berlin 2016
OrientDB - Voxxed Days Berlin 2016OrientDB - Voxxed Days Berlin 2016
OrientDB - Voxxed Days Berlin 2016
 
OrientDB - the 2nd generation of (Multi-Model) NoSQL
OrientDB - the 2nd generation  of  (Multi-Model) NoSQLOrientDB - the 2nd generation  of  (Multi-Model) NoSQL
OrientDB - the 2nd generation of (Multi-Model) NoSQL
 
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
​Fully Reactive - from Data to UI with OrientDB + Node.js + Socket.io
 
OrientDB meetup roma 2014
OrientDB meetup roma 2014OrientDB meetup roma 2014
OrientDB meetup roma 2014
 
OrientDB Codemotion 2014
OrientDB Codemotion 2014OrientDB Codemotion 2014
OrientDB Codemotion 2014
 
OrientDB - cloud barcamp Libero Cloud
OrientDB - cloud barcamp Libero CloudOrientDB - cloud barcamp Libero Cloud
OrientDB - cloud barcamp Libero Cloud
 
Orient DB on the cloud - Cloud Party 2013
Orient DB on the cloud - Cloud Party 2013Orient DB on the cloud - Cloud Party 2013
Orient DB on the cloud - Cloud Party 2013
 

Kürzlich hochgeladen

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Kürzlich hochgeladen (20)

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 

GeeCON Prague 2016 - Geospatial Graphs made easy with OrientDB

  • 1. GeoSpatial Graphs made easy with Luigi Dell’Aquila Prague, 20-21 October 2016
  • 2. Luigi Dell’Aquila Core Developer and Director of Consulting OrientDB LTD Twitter: @ldellaquila http://www.orientdb.com
  • 3. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Our goal
  • 4. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Summary •What is OrientDB •OrientDB GeoSpatial API •Importing Geo data (Node.js) •Querying Geo data (OrientDB Studio) •Displaying Geo data (Angular2, Google Maps) •Adding Relationships - graph data •Graph + Spatial queries
  • 5. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 What is OrientDB •Multi-Model Database (Document, Graph and more) •Tables Classes •Extended SQL •JOIN Physical Pointers •Schema, No-Schema, Hybrid •HTTP + Binary protocols •Stand-alone or Embedded •Distributed Multi-Master •Apache 2 license
  • 6. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Install •http://www.orientdb.com/download/ •http://central.maven.org/maven2/com/ orientechnologies/orientdb-spatial/VERSION/ orientdb-spatial-VERSION-dist.jar > cd orientdb-community/bin/ > ./server.sh
  • 7. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 OrientDB GeoSpatial Classes •OPoint •OLine •OPolygon •OMultiPoint •OMultiline •OMultiPlygon
  • 8. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 OrientDB GeoSpatial Functions •ST_GeomFromText(text) •ST_Equals(geom, geom) •ST_Contains(geom, geom) •ST_Disjoint(geom, geom) •ST_Intersects(geom, geom) •ST_Distance_Sphere(geom, geom) •and more…
  • 9. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Our Data Model CREATE CLASS POI EXTENDS V CREATE PROPERTY POI.location EMBEDDED OPoint CREATE INDEX POI.location on POI(location) SPATIAL ENGINE LUCENE CREATE CLASS Natural EXTENDS V CREATE PROPERTY Natural.location EMBEDDED OPolygon CREATE INDEX Natural.location on Natural(location) SPATIAL ENGINE LUCENE CREATE CLASS Person EXTENDS V CREATE PROPERTY Person.location EMBEDDED OPoint CREATE CLASS FriendOf EXTENDS E
  • 10. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Our Data Source (WKT) WKT,osm_id,name,type "POINT (14.4641804 50.0972109)",24569342,"Invalidovna, Metro B",station "POINT (14.4739792 50.1036789)",24569358,"Palmovka, Metro B",station "POINT (14.4921863 50.1062907)",24569412,"Českomoravská, Metro B",station
  • 11. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Now let’s import data! > npm init > npm install orientjs > npm install fast-csv > touch index.js import files http://www.mapcruzin.com/free-czech-republic-maps.htm (convert to WKT using QGis)
  • 12. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Dependencies var fs = require("fs")
 var ODatabase = require("orientjs").ODatabase
 var csv = require("fast-csv")
  • 13. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Read from CSV var stream = fs.createReadStream("data/poland-poi.csv");
 
 var csvStream = csv.parse({headers: true})
 .on("data", function(data){
 console.log(data)
 })
 .on("end", function(){
 console.log("Done!")
 });
 
 stream.pipe(csvStream); 

  • 14. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 DB connection var db = new ODatabase({
 host: "localhost",
 port: 2424,
 username: "admin",
 password: "admin",
 name: "geo"
 }) db.open().then(function(){
 } 

  • 15. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Insert var insertElement = function(data){
 db.insert().into(className).set(
 {
 name: data.name,
 type: data.type,
 location: db.rawExpression("ST_GeomFromText('"+data.WKT+"')")
 }
 ).one().then(function(){})
 } 

  • 16. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Is it done? Not yet :-( Node.js… asynchronous… promises… Final version: https://github.com/luigidellaquila/wkt-to-orient
  • 17. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Querying geo data We are here: (50.10902, 14.5831653) (lat, lon)
  • 19. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Clone the scaffolding > git clone https://github.com/luigidellaquila/geospatial-demo > git checkout warsaw_demo_step0 > cd geospatial-demo > npm install (it’s a clone of https://github.com/angular/quickstart) > npm start
  • 20. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Clone the scaffolding > git clone https://github.com/luigidellaquila/geospatial-demo > git checkout warsaw_demo_step0 > cd geospatial-demo > npm install (it’s a clone of https://github.com/angular/quickstart) > npm start > cd <orientdb-home>/www > ln -s <quickstart-path> > tsc -w
  • 21. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 We need Google Maps <script src=“https://maps.googleapis.com/maps/api/js?key=API_KEY"
 async defer></script>
  • 22. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Let’s display a map (app.html) <div class=“container">
 <div class="row">
 <div class="col-md-12" id="map" style=“height:600px"></div>
 </div>
 </div>
  • 23. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Draw the map drawMap(){
 var controller = this;
 let mapProp = {
 center: new google.maps.LatLng(52.231807953759706, 21.013154983520508),
 zoom: 16,
 mapTypeId: google.maps.MapTypeId.ROADMAP
 };
 
 controller.map = new google.maps.Map(document.getElementById("map"), mapProp);
 controller.map.addListener("click", function(point: any){
 controller.zone.run(()=> {
 controller.lat = point.latLng.lat();
 controller.lon = point.latLng.lng();
 });
 });
 }
  • 24. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Create a Person createPerson(): void{
 var location = {
 // the location object
 }
 
 var queryString = ””; // OrientDB statement
 
 this.orient.command( queryString, (result) => { /* Success callback */ }, (error) => { /* Error callback */ } );
 }

  • 25. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Create a Person createPerson(): void{
 var location = {
 "@class": "OPoint",
 coordinates: [this.lon, this.lat]
 }
 
 var queryString = ””; // OrientDB statement
 
 this.orient.command( queryString, (result) => { /* Success callback */ }, (error) => { /* Error callback */ } );}

  • 26. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Create a Person createPerson(): void{
 var location = {
 "@class": "OPoint",
 coordinates: [this.lon, this.lat]
 }
 
 var queryString = `insert into Person 
 set name = '${this.personName}', 
 location = ${JSON.stringify(location)}`;
 
 this.orient.command( queryString, (result) => { /* Success callback */ }, (error) => { /* Error callback */ } );
 }

  • 27. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Create a Person createPerson(): void{
 var location = {
 "@class": "OPoint",
 coordinates: [this.lon, this.lat]
 }
 
 var queryString = `insert into Person 
 set name = '${this.personName}', 
 location = ${JSON.stringify(location)}`;
 
 this.orient.command( queryString, (res) => {
 let body = res.json();
 let person = body.result[0];
 this.addPersonToMap(person)
 }, (e) => { console.log(e) });
 }

  • 28. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Add Person Vertex to Orient via REST API command(statement: string, success: (data: any) => void, error: (err: any) => void): void{
 var url = this.url + "sql/-/-1" 
 var headers = new Headers();
 headers.append("Authorization", "Basic " + btoa(this.username+":"+this.password));
 
 this.http.post( // HTTP POST
 url, // the URL
 JSON.stringify({
 "command": statement // the SQL command
 }),
 {headers: headers} // the authentication data
 ).toPromise()
 .then(success)
 .catch(error);
 }
  • 29. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Add Person to the Map addPersonToMap(personData:any){
 let location = personData.location;
 let coordinates = location.coordinates;
 let controller = this;
 let marker = new google.maps.Marker({
 position: {lat:coordinates[1], lng:coordinates[0]},
 map: this.map,
 title: personData.name,
 rid: personData["@rid"]
 });
 google.maps.event.addListener(marker, 'click', function() {
 controller.onMarkerClick(marker);
 });
 }
  • 30. Luigi Dell’Aquila @ldellaquila Prague, 20-21 October 2016 Add an edge between people (FriendOf) createEdge(from:any, to:any): void{
 this.orient.command(
 `create edge FriendOf from ${from.rid} to ${to.rid}`,
 (x)=>{console.log(x)},
 (x)=>{console.log(x)}
 )
 this.addEdgeBetweenMarkersToMap(from, to);
 }