docs: @Nullable
    static CircleOptions fromFeature(@NonNull Feature feature) {
      if (feature.geometry() == null) {
        throw new RuntimeException("geometry field is required");
      }
      if (!(feature.geometry() instanceof Point)) {
        return null;
      }
  
      CircleOptions options = new CircleOptions();
      options.geometry = (Point) feature.geometry();
      if (feature.hasProperty(PROPERTY_CIRCLE_RADIUS)) {
        options.circleRadius = feature.getProperty(PROPERTY_CIRCLE_RADIUS).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_CIRCLE_COLOR)) {
        options.circleColor = feature.getProperty(PROPERTY_CIRCLE_COLOR).getAsString();
      }
      if (feature.hasProperty(PROPERTY_CIRCLE_BLUR)) {
        options.circleBlur = feature.getProperty(PROPERTY_CIRCLE_BLUR).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_CIRCLE_OPACITY)) {
        options.circleOpacity = feature.getProperty(PROPERTY_CIRCLE_OPACITY).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_WIDTH)) {
        options.circleStrokeWidth = feature.getProperty(PROPERTY_CIRCLE_STROKE_WIDTH).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_COLOR)) {
        options.circleStrokeColor = feature.getProperty(PROPERTY_CIRCLE_STROKE_COLOR).getAsString();
      }
      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_OPACITY)) {
        options.circleStrokeOpacity = feature.getProperty(PROPERTY_CIRCLE_STROKE_OPACITY).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_IS_DRAGGABLE)) {
        options.isDraggable = feature.getProperty(PROPERTY_IS_DRAGGABLE).getAsBoolean();
      }
      return options;
    }