> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ploterr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Zoning rules

> Write and check the rule set of a site.

## Import

```typescript theme={null}
import { basicZoningRules, validateZoningRuleSet, ZONING_PRESETS } from '@opengeometry/floorkit';
```

## basicZoningRules

```typescript theme={null}
function basicZoningRules(input: BasicZoningInput): ZoningRuleSet;
```

## validateZoningRuleSet

Every problem with a rule set, as `BmIssue`s rooted at `path` (so `validateBuildingModel` can nest it).

```typescript theme={null}
function validateZoningRuleSet(rules: ZoningRuleSet, path?: string): BmIssue[];
```

## ZONING\_PRESETS

```typescript theme={null}
const ZONING_PRESETS: {
  'india-dcr-generic': {
    id: string;
    name: string;
    jurisdiction: string;
    rules: (
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'floorAreaRatio';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'siteCoverage';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'front';
          offsetAtGrade: number;
          quantity?: undefined;
          max?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'side';
          offsetAtGrade: number;
          startHeight: number;
          slopeDeg: number;
          quantity?: undefined;
          max?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'rear';
          offsetAtGrade: number;
          startHeight: number;
          slopeDeg: number;
          quantity?: undefined;
          max?: undefined;
        }
      | {
          kind: 'height-cap';
          id: string;
          max: number;
          quantity?: undefined;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
    )[];
    countsTowardFAR: 'gross'[];
  };
  'us-r-generic': {
    id: string;
    name: string;
    jurisdiction: string;
    rules: (
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'floorAreaRatio';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'siteCoverage';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'front';
          offsetAtGrade: number;
          quantity?: undefined;
          max?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'side';
          offsetAtGrade: number;
          quantity?: undefined;
          max?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'rear';
          offsetAtGrade: number;
          quantity?: undefined;
          max?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'front';
          offsetAtGrade: number;
          startHeight: number;
          slopeDeg: number;
          quantity?: undefined;
          max?: undefined;
        }
      | {
          kind: 'height-cap';
          id: string;
          max: number;
          quantity?: undefined;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
    )[];
    countsTowardFAR: 'gross'[];
  };
  'de-baunvo-generic': {
    id: string;
    name: string;
    jurisdiction: string;
    rules: (
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'siteCoverage';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'floorAreaRatio';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'volumeRatio';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'all';
          offsetAtGrade: number;
          startHeight: number;
          slopeDeg: number;
          quantity?: undefined;
          max?: undefined;
        }
      | {
          kind: 'height-cap';
          id: string;
          max: number;
          quantity?: undefined;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
    )[];
    countsTowardFAR: ('gross' | 'core')[];
  };
  'uk-plot-ratio-generic': {
    id: string;
    name: string;
    jurisdiction: string;
    rules: (
      | {
          kind: 'ratio-cap';
          id: string;
          quantity: 'floorAreaRatio';
          max: number;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
          min?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'front';
          offsetAtGrade: number;
          quantity?: undefined;
          max?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
          min?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'side';
          offsetAtGrade: number;
          startHeight: number;
          slopeDeg: number;
          quantity?: undefined;
          max?: undefined;
          min?: undefined;
        }
      | {
          kind: 'envelope-plane';
          id: string;
          edgeClass: 'rear';
          offsetAtGrade: number;
          startHeight: number;
          slopeDeg: number;
          quantity?: undefined;
          max?: undefined;
          min?: undefined;
        }
      | {
          kind: 'separation';
          id: string;
          min: number;
          quantity?: undefined;
          max?: undefined;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
        }
      | {
          kind: 'height-cap';
          id: string;
          max: number;
          quantity?: undefined;
          edgeClass?: undefined;
          offsetAtGrade?: undefined;
          startHeight?: undefined;
          slopeDeg?: undefined;
          min?: undefined;
        }
    )[];
    countsTowardFAR: 'gross'[];
  };
};
```

## Types

### BasicZoningInput

```typescript theme={null}
interface BasicZoningInput {
  id?: string;
  maxFAR?: number;
  maxCoverage?: number;
  maxHeight?: number;
  setbacks?: Partial<Record<LotLineClass, number>>;
  minSeparation?: number;
  countsTowardFAR?: AreaKind[];
}
```

<ResponseField name="id" type="string" />

<ResponseField name="maxFAR" type="number" />

<ResponseField name="maxCoverage" type="number">
  Ground footprint ÷ site area, 0–1.
</ResponseField>

<ResponseField name="maxHeight" type="number">
  Metres above grade.
</ResponseField>

<ResponseField name="setbacks" type="Partial<Record<LotLineClass, number>>">
  Per lot-line-class setbacks at grade (vertical planes).
</ResponseField>

<ResponseField name="minSeparation" type="number" />

<ResponseField name="countsTowardFAR" type="AreaKind[]" />

### ZoningRuleSet

```typescript theme={null}
interface ZoningRuleSet {
  id: string;
  name?: string;
  jurisdiction?: string;
  rules: ZoningRule[];
  countsTowardFAR?: AreaKind[];
}
```

<ResponseField name="id" type="string" required />

<ResponseField name="name" type="string" />

<ResponseField name="jurisdiction" type="string">
  Free text — "NYC R6", "Bengaluru BBMP 2020" — provenance lives with the consumer.
</ResponseField>

<ResponseField name="rules" type="ZoningRule[]" required />

<ResponseField name="countsTowardFAR" type="AreaKind[]">
  Storey area kinds that count toward `floorAreaRatio`. Default `["gross"]`.
</ResponseField>

### ZoningRule

```typescript theme={null}
type ZoningRule = RatioCapRule | EnvelopePlaneRule | HeightCapRule | SeparationRule;
```

### RatioCapRule

```typescript theme={null}
interface RatioCapRule {
  kind: 'ratio-cap';
  id: string;
  quantity: 'floorAreaRatio' | 'siteCoverage' | 'volumeRatio';
  max: number;
}
```

<ResponseField name="kind" type="&#x22;ratio-cap&#x22;" required />

<ResponseField name="id" type="string" required />

<ResponseField name="quantity" type="&#x22;floorAreaRatio&#x22; | &#x22;siteCoverage&#x22; | &#x22;volumeRatio&#x22;" required>
  `floorAreaRatio` = counted GFA ÷ site area; `siteCoverage` = ground footprints ÷ site area;
  `volumeRatio` = gross volume ÷ site area (BMZ).
</ResponseField>

<ResponseField name="max" type="number" required />

### HeightCapRule

```typescript theme={null}
interface HeightCapRule {
  kind: 'height-cap';
  id: string;
  max: number;
}
```

<ResponseField name="kind" type="&#x22;height-cap&#x22;" required />

<ResponseField name="id" type="string" required />

<ResponseField name="max" type="number" required>
  Metres above grade (the site elevation).
</ResponseField>

### SeparationRule

```typescript theme={null}
interface SeparationRule {
  kind: 'separation';
  id: string;
  min: number;
}
```

<ResponseField name="kind" type="&#x22;separation&#x22;" required />

<ResponseField name="id" type="string" required />

<ResponseField name="min" type="number" required>
  Minimum clear distance between two masses whose vertical ranges overlap, metres.
</ResponseField>

## Related

* [`AreaKind`](/floorkit/api/architecture/massing-helpers#areakind)
* [`BmIssue`](/floorkit/api/architecture/validate-building-model#bmissue)
* [`EnvelopePlaneRule`](/floorkit/api/world/zoning-evaluation#envelopeplanerule)
* [`LotLineClass`](/floorkit/api/world/site#lotlineclass)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.