LineString é um objeto de geometria que define uma linha por dois ou mais pontos, enquanto $geoIntersects é um operador do MongoDB que seleciona os documentos cujos dados geoespaciais cruzam com o objeto GeoJSON especificado.
Na conversão das coordenadas do campo coordinates para o campo geometry, os campos coordinates que possuíam apenas um par de coordenadas (latitude e longitude) foram convertidos no tipo Pont, e os que possuíam mais de um par de coordenadas foram convertidos no tipo Multipoint. Porém, o tipo LineString é mais apropriado para as ruas e avenidas do que Multipoint, porque estas são, na verdade, linhas no mapa. Assim sendo, vamos converter as coordenadas das ruas e avenidas em LineString usando o comando:
db.pages.find(
{ $and:
[
{
"coordinates": { "$gt": [] }
},
{ $or:
[
{ title : RegExp('^Rua')},
{ title : RegExp('^Avenida') }
]
}
]
}
).forEach(function(data) {
var geometria = {
type: "LineString",
coordinates: data.coordinates
};
data.geometry = geometria;
db.pages.save(data);
});
Após esta transformação vamos listar as ruas transversais à Rua Uruguaiana usando o comando:
> db.pages.find(
... {
... geometry: {
... $geoIntersects: {
... $geometry: {
... type: "LineString" ,
... coordinates:
... [ [ -43.17866, -22.90638 ],
... [ -43.17984, -22.90458 ],
... [ -43.18016, -22.90405 ],
... [ -43.18057, -22.90349 ],
... [ -43.18147, -22.90205 ],
... [ -43.18214, -22.90094 ]
... ]
... }
... }
... }
... }, { title: 1, _id: 0}
... );
{ "title" : "Rua do Sabão" }
{ "title" : "Rua da Alfândega" }
{ "title" : "Rua da Vala" }
{ "title" : "Rua São Pedro" }
{ "title" : "Rua das Violas" }
{ "title" : "Rua Detrás do Hospício" }
{ "title" : "Rua do Rosário" }
{ "title" : "Rua do Ouvidor" }
{ "title" : "Rua do Cano" }
{ "title" : "Rua do Piolho" }
>
A Rua da Vala é a própria Rua Uruguaiana, por isso suas coordenadas se sobrepõem.