void GeometryConverter::convertPolygonToRelation(const Polygon* polygon,
  const shared_ptr<OsmMap>& map, const shared_ptr<Relation>& r, Status s, double circularError)
{
  shared_ptr<Way> outer = convertLineStringToWay(polygon->getExteriorRing(), map, s, circularError);
  if (outer != NULL)
  {
    r->addElement(Relation::OUTER, outer);
    for (size_t i = 0; i < polygon->getNumInteriorRing(); i++)
    {
      shared_ptr<Way> inner = convertLineStringToWay(polygon->getInteriorRingN(i), map, s, circularError);
      r->addElement(Relation::INNER, inner);
    }
  }
}
Beispiel #2
0
void GeometryConverter::convertPolygonToRelation(const Polygon* polygon,
  const OsmMapPtr& map, const RelationPtr& r, Status s, double circularError)
{
  WayPtr outer = convertLineStringToWay(polygon->getExteriorRing(), map, s, circularError);
  if (outer != NULL)
  {
    r->addElement(MetadataTags::RoleOuter(), outer);
    for (size_t i = 0; i < polygon->getNumInteriorRing(); i++)
    {
      WayPtr inner = convertLineStringToWay(polygon->getInteriorRingN(i), map, s, circularError);
      r->addElement(MetadataTags::RoleInner(), inner);
    }
  }
}
Beispiel #3
0
boost::shared_ptr<Element> GeometryConverter::convertGeometryToElement(const Geometry* g, Status s,
  double circularError)
{
  LOG_VART(g->getGeometryTypeId());
  switch (g->getGeometryTypeId())
  {
  case GEOS_POINT:
    return convertPointToNode(dynamic_cast<const Point*>(g), _map, s, circularError);
  case GEOS_LINESTRING:
  case GEOS_LINEARRING:
    return convertLineStringToWay(dynamic_cast<const LineString*>(g), _map, s, circularError);
  case GEOS_POLYGON:
    return convertPolygonToElement(dynamic_cast<const Polygon*>(g), _map, s, circularError);
  case GEOS_MULTILINESTRING:
    return
      convertMultiLineStringToElement(
        dynamic_cast<const MultiLineString*>(g), _map, s, circularError);
  case GEOS_MULTIPOLYGON:
    return
      convertMultiPolygonToRelation(dynamic_cast<const MultiPolygon*>(g), _map, s, circularError);
  case GEOS_GEOMETRYCOLLECTION:
    return convertGeometryCollection(dynamic_cast<const GeometryCollection*>(g), s, circularError);
  default:
    if (logWarnCount < Log::getWarnMessageLimit())
    {
      LOG_WARN("Unsupported geometry type. Element will be removed from the map. " + g->toString());
    }
    else if (logWarnCount == Log::getWarnMessageLimit())
    {
      LOG_WARN(className() << ": " << Log::LOG_WARN_LIMIT_REACHED_MESSAGE);
    }
    logWarnCount++;
    return boost::shared_ptr<Element>();
  }
}
shared_ptr<Element> GeometryConverter::convertMultiLineStringToElement(const MultiLineString* mls,
  const shared_ptr<OsmMap>& map, Status s, double circularError)
{
  if (mls->getNumGeometries() > 1)
  {
    shared_ptr<Relation> r(new Relation(s, map->createNextRelationId(), circularError,
      Relation::MULTILINESTRING));
    for (size_t i = 0; i < mls->getNumGeometries(); i++)
    {
      shared_ptr<Way> w = convertLineStringToWay(
        dynamic_cast<const LineString*>(mls->getGeometryN(i)), map, s, circularError);
      r->addElement("", w);
    }
    map->addRelation(r);
    return r;
  }
  else
  {
    return convertLineStringToWay(dynamic_cast<const LineString*>(mls->getGeometryN(0)),
      map, s, circularError);
  }
}
Beispiel #5
0
boost::shared_ptr<Element> GeometryConverter::convertMultiLineStringToElement(const MultiLineString* mls,
  const OsmMapPtr& map, Status s, double circularError)
{
  if (mls->getNumGeometries() > 1)
  {
    RelationPtr r(new Relation(s, map->createNextRelationId(), circularError,
      MetadataTags::RelationMultilineString()));
    for (size_t i = 0; i < mls->getNumGeometries(); i++)
    {
      WayPtr w = convertLineStringToWay(
        dynamic_cast<const LineString*>(mls->getGeometryN(i)), map, s, circularError);
      r->addElement("", w);
    }
    map->addRelation(r);
    return r;
  }
  else
  {
    return convertLineStringToWay(dynamic_cast<const LineString*>(mls->getGeometryN(0)),
      map, s, circularError);
  }
}
shared_ptr<Element> GeometryConverter::convertPolygonToElement(const Polygon* polygon,
  const shared_ptr<OsmMap>& map, Status s, double circularError)
{
  // if the geometry is empty.
  if (polygon->isEmpty())
  {
    return shared_ptr<Element>();
  }
  else if (polygon->getNumInteriorRing() == 0)
  {
    shared_ptr<Way> result = convertLineStringToWay(polygon->getExteriorRing(), map, s, circularError);
    result->getTags()["area"] = "yes";
    return result;
  }
  else
  {
    return convertPolygonToRelation(polygon, map, s, circularError);
  }
}
shared_ptr<Element> GeometryConverter::convertGeometryToElement(const Geometry* g, Status s,
  double circularError)
{
  switch (g->getGeometryTypeId())
  {
  case GEOS_LINESTRING:
  case GEOS_LINEARRING:
    return convertLineStringToWay(dynamic_cast<const LineString*>(g), _map, s, circularError);
  case GEOS_POLYGON:
    return convertPolygonToElement(dynamic_cast<const Polygon*>(g), _map, s, circularError);
  case GEOS_MULTILINESTRING:
    return convertMultiLineStringToElement(dynamic_cast<const MultiLineString*>(g), _map, s,
      circularError);
  case GEOS_MULTIPOLYGON:
    return convertMultiPolygonToRelation(dynamic_cast<const MultiPolygon*>(g), _map, s,
      circularError);
  case GEOS_GEOMETRYCOLLECTION:
    return convertGeometryCollection(dynamic_cast<const GeometryCollection*>(g), s,
      circularError);
  default:
    LOG_WARN(g->toString());
    throw HootException("Unsupported geometry type.");
  }
}