5.6 LineString e $geoIntersects

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.

5. Consultas geoespaciais