Localizando uma Agulha: usando MongoDB para dados Geolocalizados

  • Published on
    17-Jan-2017

  • View
    2.538

  • Download
    0

Transcript

Trilha NoSQLCaliel CostaNerd, ouvinte de blues, pesquisador, esportista e fotgrafo amador, desenvolvedor e projetista de solues em TI. Software Designer no Superplayer.

Globalcode Open4education

Globalcode Open4education

AgendaTelecurso de GeografiaNecessidadeGeoJSONConsultasDados

Globalcode Open4education

Planeta Terra

Globalcode Open4education

#

Caliel Costa () - http://www.studyzone.org/testprep/ss5/b/comcontoclinesl.cfmPlaneta TerraDegrees, Minutes, Seconds to/from Decimal DegreesCidadeLatitudeLongitudePorto Alegre-30.03128-30 1' 52.6074" Sul-51.212548751 12' 45.1764" OesteSo Paulo-23.598877-23 35' 55.9572" Sul-46.6749596-46 40' 29.8554" OesteLondres51.499443851 29' 57.9978" Norte00 0' 0"Hong Kong22.357678222 21' 27.6402" Norte114.2196956114 13' 10.905" Leste

Globalcode Open4education

#

Planeta Terra em Polgonos(21 pontos)

Globalcode Open4education

#

Planeta Terra em Polgonos(84 Pontos)

Globalcode Open4education

#

Planeta Terra em Polgonos(338 Pontos)

Globalcode Open4education

#

Superplayer um servio de recomendao musical focado em melhorar todos os momentos da vida das pessoas atravs da trilha sonora perfeita.

Startup brasileiraCriado em 2012

Globalcode Open4education

#

Web, Android, iOS, Windows Phone, ...

Globalcode Open4education

#

+ 8.500.000USURIOS NICOS ACUMULADOS

Desde o lanamento em abril de 2013, h aprox. 1 ano e meio, o Superplayer j teve mais de 4.5 milhes de ouvintes.#

+ 1.400.000USURIOS NICOS POR MS

Dos quais 1 milho acessam o Superplayer mensalmente.#

+ 4.500.000VISITAS POR MS

Desde o lanamento em abril de 2013, h aprox. 1 ano e meio, o Superplayer j teve mais de 4.5 milhes de ouvintes.#

MongoDBNa verso 2.4 (em 2013) foi introduzido o suporte a geometrias GeoJSON, podendo ser usadas em data e consultas.

Globalcode Open4education

#

GeoJSON

typecoordinatesPointdeve ser uma posio simplesMultiPointdeve ser um array de posioLineStringdeve ser um array de 2 ou mais posiesMultiLineStringdeve ser um array de array de LineStringPolygondeve ser um LinearRing, ou seja um LineString com 4 ou mais pontos, onde o primeiro e o ltimo so posies equivalentesMultiPolygondeve ser um array de array de Polygon

Globalcode Open4education

#

GeoJSON - Point{ "type": "Point", "coordinates": [100.0, 0.0],}

Globalcode Open4education

#

GeoJSON - LineString{ "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],}

Globalcode Open4education

#

GeoJSON - Polygon{ "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ],}

Globalcode Open4education

#

GeoJSON - MultiPoint{ "type": "MultiPoint", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],}

Globalcode Open4education

#

GeoJSON - MutiLineString{ "type": "MultiLineString", "coordinates": [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ] ]}

Globalcode Open4education

#

GeoJSON - MultiPolygon{ "type": "MultiPolygon", "coordinates": [ [ [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0] ] ], [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] ] ]}

Globalcode Open4education

#

Brazil, seus 27 estados e respectivas capitais

Globalcode Open4education

#

GeoJSON - Brasil{ "_id" : ObjectId("54f4bd437da3100f4454e812"), "level" : "Country", "name" : "Brasil (BR)", "loc" : { "type" : "Polygon", "coordinates" : [ [ [ -44.69501, -1.817778 ], 336 ... [-44.69501, -1.817778 ] ] ] }}

Globalcode Open4education

#

GeoJSON - Estado So Paulo{ "_id" : ObjectId("54f4bd5b7da3100f4454e82c"), "parentid" : "54f4bd437da3100f4454e812", "level" : "State", "name" : "So Paulo (SP)", "loc" : { "type" : "Polygon", "coordinates" : [ [ [ -49.3352376, -24.2290424 ], ...497... [ -49.3352376, -24.2290424 ] ] ] }}

Globalcode Open4education

#

GeoJSON - Cidade So Paulo{ "_id" : ObjectId("54f4bd5d7da3100f4454e846"), "parentid" : "54f4bd5b7da3100f4454e82c", "level" : "City", "name" : "So Paulo", "loc" : { "type" : "Polygon", "coordinates" : [ [ [ -46.53766020909132, -23.36963320731797 ], ..310.. [ -46.53766020909132, -23.36963320731797 ] ] ] }}

Globalcode Open4education

#

Longitude e Latitude Vs Latitude e Longitude

{ "loc" : { "type" : "Polygon", "coordinates" : [ [ [ -46.53766020909132, -23.36963320731797 ], ..310.. [ -46.53766020909132, -23.36963320731797 ] ] ] }}

CidadeLatitudeLongitudeSo Paulo-23.598877-23 35' 55.9572" Sul-46.6749596-46 40' 29.8554" Oeste

Globalcode Open4education

#

Longitude e Latitude Vs Latitude e Longitude

All documents must store location data in the same order. If you use latitude and longitude as your coordinate system, always store longitude first. MongoDBs 2d spherical index operators only recognize [longitude, latitude] ordering.

Globalcode Open4education

#

Indexando GeoJSON

TipoUso2dsphereSuporta consultas que calculem geometrias em uma esfera tipo a Terra.2dGera um geohash de acordo com o valor das coordenadashaystackEste ndice um tipo especial de ndice otimizado para retornar resultados sobre areas pequenas

Globalcode Open4education

#

Indexando GeoJSON

db.locations.createIndex({ "loc" : "2dsphere"}, { "name" : "loc_"})

ndice esparsoNo pode ser usado como chave de sharding

Globalcode Open4education

#

Consultas GeoJSON

FunctionObjetivo$geoWithinSeleciona geometrias dentro dos limites de outra$geoIntersectsSeleciona geometrias em intero com outra$nearRetorna objetos na proximidade de um ponto$nearSphereRetorna objetos na proximidade de um ponto na esfera

Globalcode Open4education

#

Onde estou?query: { "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-51.2125487, -30.03128] } } }}

Globalcode Open4education

Result:Brasil (BR)Rio Grande do Sul (RS)Porto Alegre#

Onde estou?query: { "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-51.2125487, -30.03128] } } }}

Result:Brasil (BR)Rio Grande do Sul (RS)Porto Alegre

Globalcode Open4education

Result:Brasil (BR)Rio Grande do Sul (RS)Porto Alegre#

Onde estou??query: { "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-46.6749596, -23.598877] } } }}

Globalcode Open4education

Result:Brasil (BR)So Paulo (SP)So Paulo#

Onde estou??query: { "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-46.6749596, -23.598877] } } }}

Result:Brasil (BR)So Paulo (SP)So Paulo

Globalcode Open4education

Result:Brasil (BR)So Paulo (SP)So Paulo#

Cidades perto de Gramado/RS{ "level": "City", "loc": { $near: { $geometry: { type: "Point", coordinates: [-50.8586806,-29.3851463] } $minDistance: 1, $maxDistance: 300000, }, }}

Globalcode Open4education

Result:Porto AlegreFlorianpolis#

Cidades perto de Gramado/RS{ "level": "City", "loc": { $near: { $geometry: { type: "Point", coordinates: [-50.8586806,-29.3851463] } $minDistance: 1, $maxDistance: 300000, }, }}

Result:Porto AlegreFlorianpolis

Globalcode Open4education

Result:Porto AlegreFlorianpolis#

Cidades perto de Campinas/SPquery: { "level": "City", "loc": { $near: { $geometry: { type: "Point", coordinates: [-47.0562422, -22.9084404] } $minDistance: 60000, $maxDistance: 80000, } , }}

Globalcode Open4education

Result:Osasco, Carapicuba, Cotia, Vargem Grande Paulista#

Cidades perto de Campinas/SPquery: { "level": "City", "loc": { $near: { $geometry: { type: "Point", coordinates: [-47.0562422, -22.9084404] } $minDistance: 60000, $maxDistance: 80000, } , }}

Result:Osasco, Carapicuba, Cotia, Vargem Grande Paulista

Globalcode Open4education

Result:Osasco, Carapicuba, Cotia, Vargem Grande Paulista#

$NearSphereFunciona igual ao Near s que ao invs de se usar distncias em metros usa-se em radianos.

Globalcode Open4education

#

Playlists

Globalcode Open4education

#

Segmentao de Playlists

Globalcode Open4education

#

Segmentao de Playlists

Globalcode Open4education

#

Segmentao de Playlists

Globalcode Open4education

#

Segmentao de Playlists

PlaylistLocTypeLocNameCorrendo no IbiraPolygon[ [ [long, lat] ] ]So PauloRio 40 GrausPolygon[ [ [long, lat] ] ]Rio de JaneiroMens HealthPolygon[ [ [long, lat] ] ]Brasil (BR)

Globalcode Open4education

#

Buscando playlistsquery: { $or: [ { "location": { $not: { $exists: true } } }, { "location": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-46.6749596, -23.598877] } } } } ],}

Result:Acorda, Peo!, Acorda, Vagabundo!, Bebendo no Boteco, Correndo no Ibira, Dia de Chuva, Mens Health, Trabalhando numa Boa, Whiskynho com a Rapaziada, ...

Globalcode Open4education

Result:Acorda, Peo!, Acorda, Vagabundo!, Bebendo no Boteco, Correndo no Ibira, Dia de Chuva, Mens Health, Trabalhando numa Boa, Whiskynho com a Rapaziada, ...#

Buscando playlistsquery: { $or: [ { "location": { $not: { $exists: true } } }, { "location": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-47.0562422, -22.9084404] } } } } ],}

Result:Acorda, Peo!, Acorda, Vagabundo!, Bebendo no Boteco, Dia de Chuva, Mens Health, Trabalhando numa Boa, Whiskynho com a Rapaziada, ...

Globalcode Open4education

Result:Acorda, Peo!, Acorda, Vagabundo!, Bebendo no Boteco, Dia de Chuva, Mens Health, Trabalhando numa Boa, Whiskynho com a Rapaziada, ...#

Contedo LocalizadoPlaylistsSpotsPatrocnios de Playlists

Log de Playlists ouvidasLog de Msicas (Tracks) ouvidas

Globalcode Open4education

#

Optimizao

PlayMongoDBAPIWebPlay @RockPlaylist com tracks

Rock por Caliel

Globalcode Open4education

#

Optimizao

APIiOSPlay @RockMongoDBdb.locations.find({ "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-46.6749596, -23.598877] } } }}{ _id: ABC, level: Country, name: Brasil (BR) },{ _id: DEF, level: State, name: So Paulo (SP) },{ _id: GHI, level: City, name: So Paulo },

Globalcode Open4education

#

Optimizao

APIiOSPlay @RockMongoDB{ _id: ABC, name: Acorda, Peo! },{ _id: ABC, name: Acorda, Vagabundo! },{ _id: ABC, name: Bebendo no Boteco },{ _id: ABC, name: Correndo no Ibira },{ _id: ABC, name: Dia de Chuva },{ _id: ABC, name: Mens Health },{ _id: ABC, name: Trabalhando numa Boa },{ _id: ABC, name: Whiskynho com a Rapaziada },db.playlists.find({ $or: [ { "location": { $not: { $exists: true } } }, { "location.name": "Brasil (BR)" }, { "location.name": "So Paulo (SP)" }, { "location.name": "So Paulo" }, ],}

Globalcode Open4education

#

Optimizao

APIiOSPlay @RockMongoDBdb.plays.insert({playlist: { name: "Rock" },geolocation: {coordinates: [-46.6749596, -23.598877],locations: [{ sourceid: ABC, level: Country, name: Brasil (BR) },{ sourceid: DEF, level: State, name: So Paulo (SP) },{ sourceid: GHI, level: City, name: So Paulo },],}});

Globalcode Open4education

#

ClosureO MongoDB fornece toda a infraestrutura necessria para se trabalhar com dados geolocalizados de maneira simples

No a toa que usado/foi feito junto com o Foursquare

A nossa estrutura est pronta para crescer. Para colocar novas cidades, basta mapea-las e importar o arquivo kml. A demanda de playlists e spots vem crescendo nos ltimos meses sem que tivessemos que alterar a infraestrutura para isso.

Globalcode Open4education

#

Perguntas?

Globalcode Open4education

#

jointheband@superplayer.fm

Globalcode Open4education

#

Documentao MongoDBhttp://docs.mongodb.org/manual/applications/geospatial-indexes/

http://docs.mongodb.org/manual/reference/operator/query-geospatial/

Globalcode Open4education

#

Recommended

View more >