mirror of
https://github.com/boostorg/geometry.git
synced 2025-05-11 13:34:10 +00:00
Ifdefed some examples for release branch
[SVN r70919]
This commit is contained in:
parent
85810e3132
commit
1431123722
@ -16,7 +16,7 @@
|
|||||||
#include <boost/geometry/geometry.hpp>
|
#include <boost/geometry/geometry.hpp>
|
||||||
#include <boost/geometry/geometries/geometries.hpp>
|
#include <boost/geometry/geometries/geometries.hpp>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(HAVE_TTMATH)
|
||||||
# include <boost/geometry/extensions/contrib/ttmath_stub.hpp>
|
# include <boost/geometry/extensions/contrib/ttmath_stub.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ int main()
|
|||||||
boost::geometry::model::d2::point_xy<double> p1;
|
boost::geometry::model::d2::point_xy<double> p1;
|
||||||
assign(p1, 1.2345, 2.3456);
|
assign(p1, 1.2345, 2.3456);
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(HAVE_TTMATH)
|
||||||
boost::geometry::model::d2::point_xy<ttmath::Big<1,4> > p2;
|
boost::geometry::model::d2::point_xy<ttmath::Big<1,4> > p2;
|
||||||
assign(p2, "1.2345", "2.3456"); /*< It is possible to assign coordinates with other types than the coordinate type.
|
assign(p2, "1.2345", "2.3456"); /*< It is possible to assign coordinates with other types than the coordinate type.
|
||||||
For ttmath, you can e.g. conveniently use strings. The advantage is that it then has higher precision, because
|
For ttmath, you can e.g. conveniently use strings. The advantage is that it then has higher precision, because
|
||||||
@ -40,7 +40,7 @@ int main()
|
|||||||
std::cout
|
std::cout
|
||||||
<< std::setprecision(20)
|
<< std::setprecision(20)
|
||||||
<< boost::geometry::dsv(p1) << std::endl
|
<< boost::geometry::dsv(p1) << std::endl
|
||||||
#if defined(_MSC_VER)
|
#if defined(HAVE_TTMATH)
|
||||||
<< boost::geometry::dsv(p2) << std::endl
|
<< boost::geometry::dsv(p2) << std::endl
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
@ -13,11 +13,15 @@
|
|||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
template <typename Geometry, typename Range>
|
template <typename Geometry, typename Range>
|
||||||
void create_svg(std::string const& filename, Geometry const& a, Geometry const& b, Range const& range)
|
void create_svg(std::string const& filename, Geometry const& a, Geometry const& b, Range const& range)
|
||||||
{
|
{
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
std::cout << std::endl << "[$img/algorithms/" << boost::replace_all_copy(filename, ".svg", ".png") << "]" << std::endl << std::endl;
|
std::cout << std::endl << "[$img/algorithms/" << boost::replace_all_copy(filename, ".svg", ".png") << "]" << std::endl << std::endl;
|
||||||
|
|
||||||
typedef typename boost::geometry::point_type<Geometry>::type point_type;
|
typedef typename boost::geometry::point_type<Geometry>::type point_type;
|
||||||
@ -38,6 +42,7 @@ void create_svg(std::string const& filename, Geometry const& a, Geometry const&
|
|||||||
mapper.text(boost::geometry::return_centroid<point_type>(g), out.str(),
|
mapper.text(boost::geometry::return_centroid<point_type>(g), out.str(),
|
||||||
"fill:rgb(0,0,0);font-family:Arial;font-size:10px");
|
"fill:rgb(0,0,0);font-family:Arial;font-size:10px");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: convert manually from svg to png using Inkscape ctrl-shift-E
|
// NOTE: convert manually from svg to png using Inkscape ctrl-shift-E
|
||||||
|
@ -13,11 +13,15 @@
|
|||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
template <typename Geometry1, typename Geometry2>
|
template <typename Geometry1, typename Geometry2>
|
||||||
void create_svg(std::string const& filename, Geometry1 const& a, Geometry2 const& b)
|
void create_svg(std::string const& filename, Geometry1 const& a, Geometry2 const& b)
|
||||||
{
|
{
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
std::cout << std::endl << "[$img/algorithms/" << boost::replace_all_copy(filename, ".svg", ".png") << "]" << std::endl << std::endl;
|
std::cout << std::endl << "[$img/algorithms/" << boost::replace_all_copy(filename, ".svg", ".png") << "]" << std::endl << std::endl;
|
||||||
|
|
||||||
typedef typename boost::geometry::point_type<Geometry1>::type point_type;
|
typedef typename boost::geometry::point_type<Geometry1>::type point_type;
|
||||||
@ -36,6 +40,7 @@ void create_svg(std::string const& filename, Geometry1 const& a, Geometry2 const
|
|||||||
{
|
{
|
||||||
mapper.map(b, "opacity:0.8;fill:none;stroke:rgb(255,128,0);stroke-width:4;stroke-dasharray:1,7;stroke-linecap:round");
|
mapper.map(b, "opacity:0.8;fill:none;stroke:rgb(255,128,0);stroke-width:4;stroke-dasharray:1,7;stroke-linecap:round");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: convert manually from svg to png using Inkscape ctrl-shift-E
|
// NOTE: convert manually from svg to png using Inkscape ctrl-shift-E
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
#include <boost/geometry/geometry.hpp>
|
#include <boost/geometry/geometry.hpp>
|
||||||
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>
|
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
@ -32,8 +34,10 @@ int main(void)
|
|||||||
typedef bg::model::polygon<point_2d> polygon_2d;
|
typedef bg::model::polygon<point_2d> polygon_2d;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
std::ofstream stream("05_a_intersection_polygon_example.svg");
|
std::ofstream stream("05_a_intersection_polygon_example.svg");
|
||||||
bg::svg_mapper<point_2d> svg(stream, 500, 500);
|
bg::svg_mapper<point_2d> svg(stream, 500, 500);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Define a polygons and fill the outer rings.
|
// Define a polygons and fill the outer rings.
|
||||||
polygon_2d a;
|
polygon_2d a;
|
||||||
@ -45,7 +49,6 @@ int main(void)
|
|||||||
}
|
}
|
||||||
bg::correct(a);
|
bg::correct(a);
|
||||||
std::cout << "A: " << bg::dsv(a) << std::endl;
|
std::cout << "A: " << bg::dsv(a) << std::endl;
|
||||||
svg.add(a);
|
|
||||||
|
|
||||||
polygon_2d b;
|
polygon_2d b;
|
||||||
{
|
{
|
||||||
@ -56,10 +59,13 @@ int main(void)
|
|||||||
}
|
}
|
||||||
bg::correct(b);
|
bg::correct(b);
|
||||||
std::cout << "B: " << bg::dsv(b) << std::endl;
|
std::cout << "B: " << bg::dsv(b) << std::endl;
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
|
svg.add(a);
|
||||||
svg.add(b);
|
svg.add(b);
|
||||||
|
|
||||||
svg.map(a, "opacity:0.6;fill:rgb(0,255,0);");
|
svg.map(a, "opacity:0.6;fill:rgb(0,255,0);");
|
||||||
svg.map(b, "opacity:0.6;fill:rgb(0,0,255);");
|
svg.map(b, "opacity:0.6;fill:rgb(0,0,255);");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Calculate interesection(s)
|
// Calculate interesection(s)
|
||||||
@ -70,7 +76,9 @@ int main(void)
|
|||||||
BOOST_FOREACH(polygon_2d const& polygon, intersection)
|
BOOST_FOREACH(polygon_2d const& polygon, intersection)
|
||||||
{
|
{
|
||||||
std::cout << bg::dsv(polygon) << std::endl;
|
std::cout << bg::dsv(polygon) << std::endl;
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
svg.map(polygon, "opacity:0.5;fill:none;stroke:rgb(255,0,0);stroke-width:6");
|
svg.map(polygon, "opacity:0.5;fill:none;stroke:rgb(255,0,0);stroke-width:6");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
#include <boost/geometry/geometry.hpp>
|
#include <boost/geometry/geometry.hpp>
|
||||||
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>
|
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>
|
||||||
|
|
||||||
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
@ -43,6 +45,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
bg::correct(p);
|
bg::correct(p);
|
||||||
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
// Create SVG-mapper
|
// Create SVG-mapper
|
||||||
std::ofstream stream("05_b_overlay_linestring_polygon_example.svg");
|
std::ofstream stream("05_b_overlay_linestring_polygon_example.svg");
|
||||||
bg::svg_mapper<point_2d> svg(stream, 500, 500);
|
bg::svg_mapper<point_2d> svg(stream, 500, 500);
|
||||||
@ -52,7 +55,7 @@ int main(void)
|
|||||||
// Map geometries
|
// Map geometries
|
||||||
svg.map(ls, "opacity:0.6;stroke:rgb(255,0,0);stroke-width:2;");
|
svg.map(ls, "opacity:0.6;stroke:rgb(255,0,0);stroke-width:2;");
|
||||||
svg.map(p, "opacity:0.6;fill:rgb(0,0,255);");
|
svg.map(p, "opacity:0.6;fill:rgb(0,0,255);");
|
||||||
|
#endif
|
||||||
|
|
||||||
// Calculate intersection points (turn points)
|
// Calculate intersection points (turn points)
|
||||||
typedef bg::detail::overlay::turn_info<point_2d> turn_info;
|
typedef bg::detail::overlay::turn_info<point_2d> turn_info;
|
||||||
@ -76,8 +79,10 @@ int main(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
std::cout << action << " polygon at " << bg::dsv(turn.point) << std::endl;
|
std::cout << action << " polygon at " << bg::dsv(turn.point) << std::endl;
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
svg.map(turn.point, "fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1");
|
svg.map(turn.point, "fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1");
|
||||||
svg.text(turn.point, action, "fill:rgb(0,0,0);font-family:Arial;font-size:10px");
|
svg.text(turn.point, action, "fill:rgb(0,0,0);font-family:Arial;font-size:10px");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -19,9 +19,12 @@
|
|||||||
#include <boost/geometry/algorithms/centroid.hpp>
|
#include <boost/geometry/algorithms/centroid.hpp>
|
||||||
#include <boost/geometry/strategies/transform.hpp>
|
#include <boost/geometry/strategies/transform.hpp>
|
||||||
#include <boost/geometry/strategies/transform/matrix_transformers.hpp>
|
#include <boost/geometry/strategies/transform/matrix_transformers.hpp>
|
||||||
#include <boost/geometry/extensions/io/svg/write_svg.hpp>
|
|
||||||
#include <boost/geometry/domains/gis/io/wkt/read_wkt.hpp>
|
#include <boost/geometry/domains/gis/io/wkt/read_wkt.hpp>
|
||||||
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/write_svg.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/random.hpp>
|
#include <boost/random.hpp>
|
||||||
#include <boost/range.hpp>
|
#include <boost/range.hpp>
|
||||||
@ -84,8 +87,9 @@ struct svg_output
|
|||||||
void put(G const& g, std::string const& label)
|
void put(G const& g, std::string const& label)
|
||||||
{
|
{
|
||||||
std::string style_str(style.fill(opacity) + style.stroke(5, opacity));
|
std::string style_str(style.fill(opacity) + style.stroke(5, opacity));
|
||||||
os << ::boost::geometry::svg(g, style_str) << std::endl;
|
#if defined(HAVE_SVG)
|
||||||
|
os << boost::geometry::svg(g, style_str) << std::endl;
|
||||||
|
#endif
|
||||||
if (!label.empty())
|
if (!label.empty())
|
||||||
{
|
{
|
||||||
typename point_type<G>::type c;
|
typename point_type<G>::type c;
|
||||||
@ -101,6 +105,7 @@ private:
|
|||||||
random_style style;
|
random_style style;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
using namespace boost::geometry::strategy::transform;
|
using namespace boost::geometry::strategy::transform;
|
||||||
|
@ -30,10 +30,12 @@
|
|||||||
// Yes, this example currently uses some extensions:
|
// Yes, this example currently uses some extensions:
|
||||||
|
|
||||||
// For output:
|
// For output:
|
||||||
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
// For distance-calculations over the Earth:
|
// For distance-calculations over the Earth:
|
||||||
#include <boost/geometry/extensions/gis/geographic/strategies/andoyer.hpp>
|
//#include <boost/geometry/extensions/gis/geographic/strategies/andoyer.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -260,10 +262,11 @@ inline void build_route(Graph const& graph,
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// Define a point in the Geographic coordinate system
|
// Define a point in the Geographic coordinate system (currently Spherical)
|
||||||
|
// (geographic calculations are in an extension; for sample it makes no difference)
|
||||||
typedef boost::geometry::model::point
|
typedef boost::geometry::model::point
|
||||||
<
|
<
|
||||||
double, 2, boost::geometry::cs::geographic<boost::geometry::degree>
|
double, 2, boost::geometry::cs::spherical<boost::geometry::degree>
|
||||||
> point_type;
|
> point_type;
|
||||||
|
|
||||||
typedef boost::geometry::model::linestring<point_type> line_type;
|
typedef boost::geometry::model::linestring<point_type> line_type;
|
||||||
@ -302,8 +305,12 @@ int main()
|
|||||||
double const km = 1000.0;
|
double const km = 1000.0;
|
||||||
std::cout << "distances, all in KM" << std::endl
|
std::cout << "distances, all in KM" << std::endl
|
||||||
<< std::fixed << std::setprecision(0);
|
<< std::fixed << std::setprecision(0);
|
||||||
|
|
||||||
|
// To calculate distance, declare and construct a strategy with average earth radius
|
||||||
|
boost::geometry::strategy::distance::haversine<point_type> haversine(6372795.0);
|
||||||
|
|
||||||
// Main functionality: calculate shortest routes from/to all cities
|
// Main functionality: calculate shortest routes from/to all cities
|
||||||
|
|
||||||
|
|
||||||
// For the first one, the complete route is stored as a linestring
|
// For the first one, the complete route is stored as a linestring
|
||||||
bool first = true;
|
bool first = true;
|
||||||
@ -329,7 +336,7 @@ int main()
|
|||||||
if (! boost::equals(city1.get<1>(), city2.get<1>()))
|
if (! boost::equals(city1.get<1>(), city2.get<1>()))
|
||||||
{
|
{
|
||||||
double distance = costs[city2.get<2>()] / km;
|
double distance = costs[city2.get<2>()] / km;
|
||||||
double acof = boost::geometry::distance(city1.get<0>(), city2.get<0>()) / km;
|
double acof = boost::geometry::distance(city1.get<0>(), city2.get<0>(), haversine) / km;
|
||||||
|
|
||||||
std::cout
|
std::cout
|
||||||
<< std::setiosflags (std::ios_base::left) << std::setw(15)
|
<< std::setiosflags (std::ios_base::left) << std::setw(15)
|
||||||
@ -351,6 +358,7 @@ int main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
// Create the SVG
|
// Create the SVG
|
||||||
std::ofstream stream("routes.svg");
|
std::ofstream stream("routes.svg");
|
||||||
boost::geometry::svg_mapper<point_type> mapper(stream, 600, 600);
|
boost::geometry::svg_mapper<point_type> mapper(stream, 600, 600);
|
||||||
@ -378,6 +386,7 @@ int main()
|
|||||||
mapper.text(city.get<0>(), city.get<1>(),
|
mapper.text(city.get<0>(), city.get<1>(),
|
||||||
"fill:rgb(0,0,0);font-family:Arial;font-size:10px", 5, 5);
|
"fill:rgb(0,0,0);font-family:Arial;font-size:10px", 5, 5);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -34,10 +34,12 @@
|
|||||||
// Yes, this example currently uses some extensions:
|
// Yes, this example currently uses some extensions:
|
||||||
|
|
||||||
// For output:
|
// For output:
|
||||||
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
#if defined(HAVE_SVG)
|
||||||
|
# include <boost/geometry/extensions/io/svg/svg_mapper.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
// For distance-calculations over the Earth:
|
// For distance-calculations over the Earth:
|
||||||
#include <boost/geometry/extensions/gis/geographic/strategies/andoyer.hpp>
|
//#include <boost/geometry/extensions/gis/geographic/strategies/andoyer.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -246,10 +248,11 @@ inline void build_route(Graph const& graph,
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// Define a point in the Geographic coordinate system
|
// Define a point in the Geographic coordinate system (currently Spherical)
|
||||||
|
// (geographic calculations are in an extension; for sample it makes no difference)
|
||||||
typedef boost::geometry::model::point
|
typedef boost::geometry::model::point
|
||||||
<
|
<
|
||||||
double, 2, boost::geometry::cs::geographic<boost::geometry::degree>
|
double, 2, boost::geometry::cs::spherical<boost::geometry::degree>
|
||||||
> point_type;
|
> point_type;
|
||||||
|
|
||||||
typedef boost::geometry::model::linestring<point_type> line_type;
|
typedef boost::geometry::model::linestring<point_type> line_type;
|
||||||
@ -291,6 +294,9 @@ int main()
|
|||||||
std::cout << "distances, all in KM" << std::endl
|
std::cout << "distances, all in KM" << std::endl
|
||||||
<< std::fixed << std::setprecision(0);
|
<< std::fixed << std::setprecision(0);
|
||||||
|
|
||||||
|
// To calculate distance, declare and construct a strategy with average earth radius
|
||||||
|
boost::geometry::strategy::distance::haversine<point_type> haversine(6372795.0);
|
||||||
|
|
||||||
// Main functionality: calculate shortest routes from/to all cities
|
// Main functionality: calculate shortest routes from/to all cities
|
||||||
|
|
||||||
// For the first one, the complete route is stored as a linestring
|
// For the first one, the complete route is stored as a linestring
|
||||||
@ -317,7 +323,7 @@ int main()
|
|||||||
if (! boost::equals(city1.get<1>(), city2.get<1>()))
|
if (! boost::equals(city1.get<1>(), city2.get<1>()))
|
||||||
{
|
{
|
||||||
double distance = costs[city2.get<2>()] / km;
|
double distance = costs[city2.get<2>()] / km;
|
||||||
double acof = boost::geometry::distance(city1.get<0>(), city2.get<0>()) / km;
|
double acof = boost::geometry::distance(city1.get<0>(), city2.get<0>(), haversine) / km;
|
||||||
|
|
||||||
std::cout
|
std::cout
|
||||||
<< std::setiosflags (std::ios_base::left) << std::setw(15)
|
<< std::setiosflags (std::ios_base::left) << std::setw(15)
|
||||||
@ -339,6 +345,7 @@ int main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_SVG)
|
||||||
// Create the SVG
|
// Create the SVG
|
||||||
std::ofstream stream("routes.svg");
|
std::ofstream stream("routes.svg");
|
||||||
boost::geometry::svg_mapper<point_type> mapper(stream, 600, 600);
|
boost::geometry::svg_mapper<point_type> mapper(stream, 600, 600);
|
||||||
@ -366,6 +373,7 @@ int main()
|
|||||||
mapper.text(city.get<0>(), city.get<1>(),
|
mapper.text(city.get<0>(), city.get<1>(),
|
||||||
"fill:rgb(0,0,0);font-family:Arial;font-size:10px", 5, 5);
|
"fill:rgb(0,0,0);font-family:Arial;font-size:10px", 5, 5);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user