Skip to content

Circle to Geometry conversion is highly inaccurate for GeoCircle #177

@hsbakshi

Description

@hsbakshi

Problem: JtsShapeFactory has a 'getGeometryFrom' method that allows converting a Shape object to a Geometry object. This method can be used to transform a Circle to a Geometry (Polygon). This conversion currently returns a highly inaccurate result when

Test case:

@Test
public void testCircleGeometryConversions() {
  // Nunavat (Far North)
  circleGeometryConversionTest(-83.10, 70.30, 100);
}
                                                                                                             
private void circleGeometryConversionTest(double x, double y, double radiusKm) {
  Point circleCenter = new PointImpl(x, y, SpatialContext.GEO);
  double radiusDeg = DistanceUtils.dist2Degrees(radiusKm, DistanceUtils.EARTH_EQUATORIAL_RADIUS_KM);
  GeoCircle geoCircle = new GeoCircle(circleCenter, radiusDeg, SpatialContext.GEO);
                                                                                                             
  JtsShapeFactory shapeFactory = JtsSpatialContext.GEO.getShapeFactory();
  // Let's ensure the circle-to-polygon conversion is accurate accounting for geodesics.
  Geometry geometry = shapeFactory.getGeometryFrom(geoCircle);
  Assert.assertTrue(geometry instanceof Polygon);
  Polygon polygon = (Polygon) geometry;
  Coordinate[] coordinates = polygon.getExteriorRing().getCoordinates();
  int size = coordinates.length;
  Assert.assertTrue(size >= 100);
  GeodesicSphereDistCalc distCalc = new GeodesicSphereDistCalc.Haversine();
  for (Coordinate coordinate : coordinates) {
    // Check distance from center of each point
    Point point = new PointImpl(coordinate.x, coordinate.y, SpatialContext.GEO);
    double distance = distCalc.distance(point, circleCenter);
    double distanceKm = DistanceUtils.degrees2Dist(distance, DistanceUtils.EARTH_MEAN_RADIUS_KM);
    double expectedPrecision = radiusKm / 100;
    //Assert.assertEquals("Distance mismatch:  Point:" + point, radiusKm, distanceKm, expectedPrecision);
    System.out.println(String.format("Distance from point to center: %.2f km. Expected: %.2f km", distanceKm,
            radiusKm));
  }
}

Console output:
Distance from point to center: 99.91 km. Expected: 100.00 km
Distance from point to center: 101.04 km. Expected: 100.00 km
Distance from point to center: 105.10 km. Expected: 100.00 km
Distance from point to center: 111.72 km. Expected: 100.00 km
Distance from point to center: 120.40 km. Expected: 100.00 km
Distance from point to center: 130.60 km. Expected: 100.00 km
Distance from point to center: 141.86 km. Expected: 100.00 km
Distance from point to center: 153.78 km. Expected: 100.00 km
Distance from point to center: 166.06 km. Expected: 100.00 km
Distance from point to center: 178.45 km. Expected: 100.00 km
Distance from point to center: 190.76 km. Expected: 100.00 km
Distance from point to center: 202.81 km. Expected: 100.00 km
Distance from point to center: 214.49 km. Expected: 100.00 km
Distance from point to center: 225.66 km. Expected: 100.00 km
Distance from point to center: 236.24 km. Expected: 100.00 km
Distance from point to center: 246.15 km. Expected: 100.00 km
Distance from point to center: 255.32 km. Expected: 100.00 km
Distance from point to center: 263.67 km. Expected: 100.00 km
Distance from point to center: 271.16 km. Expected: 100.00 km
Distance from point to center: 277.75 km. Expected: 100.00 km
Distance from point to center: 283.38 km. Expected: 100.00 km
Distance from point to center: 288.04 km. Expected: 100.00 km
Distance from point to center: 291.69 km. Expected: 100.00 km
Distance from point to center: 294.31 km. Expected: 100.00 km
Distance from point to center: 295.89 km. Expected: 100.00 km
Distance from point to center: 296.42 km. Expected: 100.00 km
Distance from point to center: 295.89 km. Expected: 100.00 km
Distance from point to center: 294.31 km. Expected: 100.00 km
Distance from point to center: 291.69 km. Expected: 100.00 km
Distance from point to center: 288.04 km. Expected: 100.00 km
Distance from point to center: 283.38 km. Expected: 100.00 km
Distance from point to center: 277.75 km. Expected: 100.00 km
Distance from point to center: 271.16 km. Expected: 100.00 km
Distance from point to center: 263.67 km. Expected: 100.00 km
Distance from point to center: 255.32 km. Expected: 100.00 km
Distance from point to center: 246.15 km. Expected: 100.00 km
Distance from point to center: 236.24 km. Expected: 100.00 km
Distance from point to center: 225.66 km. Expected: 100.00 km
Distance from point to center: 214.49 km. Expected: 100.00 km
Distance from point to center: 202.81 km. Expected: 100.00 km
Distance from point to center: 190.76 km. Expected: 100.00 km
Distance from point to center: 178.45 km. Expected: 100.00 km
Distance from point to center: 166.06 km. Expected: 100.00 km
Distance from point to center: 153.78 km. Expected: 100.00 km
Distance from point to center: 141.86 km. Expected: 100.00 km
Distance from point to center: 130.60 km. Expected: 100.00 km
Distance from point to center: 120.40 km. Expected: 100.00 km
Distance from point to center: 111.72 km. Expected: 100.00 km
Distance from point to center: 105.10 km. Expected: 100.00 km
Distance from point to center: 101.04 km. Expected: 100.00 km
Distance from point to center: 99.91 km. Expected: 100.00 km
Distance from point to center: 101.84 km. Expected: 100.00 km
Distance from point to center: 106.61 km. Expected: 100.00 km
Distance from point to center: 113.80 km. Expected: 100.00 km
Distance from point to center: 122.89 km. Expected: 100.00 km
Distance from point to center: 133.35 km. Expected: 100.00 km
Distance from point to center: 144.74 km. Expected: 100.00 km
Distance from point to center: 156.69 km. Expected: 100.00 km
Distance from point to center: 168.93 km. Expected: 100.00 km
Distance from point to center: 181.21 km. Expected: 100.00 km
Distance from point to center: 193.36 km. Expected: 100.00 km
Distance from point to center: 205.22 km. Expected: 100.00 km
Distance from point to center: 216.67 km. Expected: 100.00 km
Distance from point to center: 227.62 km. Expected: 100.00 km
Distance from point to center: 237.96 km. Expected: 100.00 km
Distance from point to center: 247.62 km. Expected: 100.00 km
Distance from point to center: 256.54 km. Expected: 100.00 km
Distance from point to center: 264.67 km. Expected: 100.00 km
Distance from point to center: 271.95 km. Expected: 100.00 km
Distance from point to center: 278.34 km. Expected: 100.00 km
Distance from point to center: 283.80 km. Expected: 100.00 km
Distance from point to center: 288.31 km. Expected: 100.00 km
Distance from point to center: 291.84 km. Expected: 100.00 km
Distance from point to center: 294.38 km. Expected: 100.00 km
Distance from point to center: 295.91 km. Expected: 100.00 km
Distance from point to center: 296.42 km. Expected: 100.00 km
Distance from point to center: 295.91 km. Expected: 100.00 km
Distance from point to center: 294.38 km. Expected: 100.00 km
Distance from point to center: 291.84 km. Expected: 100.00 km
Distance from point to center: 288.31 km. Expected: 100.00 km
Distance from point to center: 283.80 km. Expected: 100.00 km
Distance from point to center: 278.34 km. Expected: 100.00 km
Distance from point to center: 271.95 km. Expected: 100.00 km
Distance from point to center: 264.67 km. Expected: 100.00 km
Distance from point to center: 256.54 km. Expected: 100.00 km
Distance from point to center: 247.62 km. Expected: 100.00 km
Distance from point to center: 237.96 km. Expected: 100.00 km
Distance from point to center: 227.62 km. Expected: 100.00 km
Distance from point to center: 216.67 km. Expected: 100.00 km
Distance from point to center: 205.22 km. Expected: 100.00 km
Distance from point to center: 193.36 km. Expected: 100.00 km
Distance from point to center: 181.21 km. Expected: 100.00 km
Distance from point to center: 168.93 km. Expected: 100.00 km
Distance from point to center: 156.69 km. Expected: 100.00 km
Distance from point to center: 144.74 km. Expected: 100.00 km
Distance from point to center: 133.35 km. Expected: 100.00 km
Distance from point to center: 122.89 km. Expected: 100.00 km
Distance from point to center: 113.80 km. Expected: 100.00 km
Distance from point to center: 106.61 km. Expected: 100.00 km
Distance from point to center: 101.84 km. Expected: 100.00 km
Distance from point to center: 99.91 km. Expected: 100.00 km

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions