I have a dataset of lat/long that I would like to match on dynamically generated circle/polygon from specific point with different radius.

I have already completed how to match lat/long with custom defined boundaries in a shapefile using GeoTools.

Now, instead of using boundaries defined in a custom shapefile, I would like to do following steps

  1. Find centroid of the boundary (polygon)

  2. Using centroid lat/long, create multiple circles/polygon with radius 5, 10 and 15 miles like 5 miles = Polygon1, 10 miles = Polygon2 15 miles = Polygon3

  3. Match dataset of lat/long to see how many points lie in Polygon1, Polygon2 and Polygon3.


To buffer the point the best way is to transform your feature to a projected crs and then use the JTS buffer operation. To create a 10 mile length use Quantity<Length> dist = Quantities.getQuantity(10.0, USCustomary.MILE);

  public Geometry bufferPoint(Quantity<Length> distance, CoordinateReferenceSystem origCRS, Geometry geom) {
    Geometry pGeom = geom;
    MathTransform toTransform, fromTransform = null;
    // reproject the geometry to a local projection
    Unit<Length> unit = distance.getUnit();
    if (!(origCRS instanceof ProjectedCRS)) {

      double x = geom.getCoordinate().x;
      double y = geom.getCoordinate().y;

      String code = "AUTO:42001," + x + "," + y;
      // System.out.println(code);
      CoordinateReferenceSystem auto;
      try {
        auto = CRS.decode(code);
        toTransform = CRS.findMathTransform(origCRS, auto);
        fromTransform = CRS.findMathTransform(auto, origCRS);
        pGeom = JTS.transform(geom, toTransform);
        unit = SI.METRE;
      } catch (MismatchedDimensionException | TransformException | FactoryException e) {
        // TODO Auto-generated catch block

    } else {
      unit = (Unit<Length>) origCRS.getCoordinateSystem().getAxis(0).getUnit();

    UnitConverter converter = distance.getUnit().getConverterTo(unit);
    // buffer
    Geometry out = pGeom.buffer(converter.convert(distance.getValue()).doubleValue());
    Geometry retGeom = out;
    // reproject the geometry to the original projection
    if (!(origCRS instanceof ProjectedCRS)) {
      try {
        retGeom = JTS.transform(out, fromTransform);

      } catch (MismatchedDimensionException | TransformException e) {
        // TODO Auto-generated catch block
    return retGeom;

For a quick and dirty buffer you can use the GeodeticCalculator to fudge the X/Y distortion and hope for the best.

  public Geometry simpleBuffer(Quantity<Length> distance,Point point) {
    GeodeticCalculator calc = new  GeodeticCalculator(DefaultGeographicCRS.WGS84);
    calc.setStartingGeographicPoint(point.getX(), point.getY());
    UnitConverter converter = distance.getUnit().getConverterTo(SI.METRE);
    double d = converter.convert(distance.getValue()).doubleValue();
    calc.setDirection(0.0, d);
    Point2D p2 = calc.getDestinationGeographicPoint();
    calc.setDirection(90.0, d);
    Point2D p3 = calc.getDestinationGeographicPoint();

    double dy = p2.getY() - point.getY();
    double dx = p3.getX() - point.getX();
    double dist = (dy + dx) / 2.0;
    Polygon p1 = (Polygon) point.buffer(dist);
    return p1;

Here's the results the stripy polygon is the "correct" buffer, the orange one is the simple one using lat/lon.

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.