Import
import { basicZoningRules, validateZoningRuleSet, ZONING_PRESETS } from '@opengeometry/floorkit';
basicZoningRules
function basicZoningRules(input: BasicZoningInput): ZoningRuleSet;
validateZoningRuleSet
Every problem with a rule set, asBmIssues rooted at path (so validateBuildingModel can nest it).
function validateZoningRuleSet(rules: ZoningRuleSet, path?: string): BmIssue[];
ZONING_PRESETS
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
interface BasicZoningInput {
id?: string;
maxFAR?: number;
maxCoverage?: number;
maxHeight?: number;
setbacks?: Partial<Record<LotLineClass, number>>;
minSeparation?: number;
countsTowardFAR?: AreaKind[];
}
string
number
number
Ground footprint ÷ site area, 0–1.
number
Metres above grade.
Partial<Record<LotLineClass, number>>
Per lot-line-class setbacks at grade (vertical planes).
number
AreaKind[]
ZoningRuleSet
interface ZoningRuleSet {
id: string;
name?: string;
jurisdiction?: string;
rules: ZoningRule[];
countsTowardFAR?: AreaKind[];
}
string
required
string
string
Free text — “NYC R6”, “Bengaluru BBMP 2020” — provenance lives with the consumer.
ZoningRule[]
required
AreaKind[]
Storey area kinds that count toward
floorAreaRatio. Default ["gross"].ZoningRule
type ZoningRule = RatioCapRule | EnvelopePlaneRule | HeightCapRule | SeparationRule;
RatioCapRule
interface RatioCapRule {
kind: 'ratio-cap';
id: string;
quantity: 'floorAreaRatio' | 'siteCoverage' | 'volumeRatio';
max: number;
}
"ratio-cap"
required
string
required
"floorAreaRatio" | "siteCoverage" | "volumeRatio"
required
floorAreaRatio = counted GFA ÷ site area; siteCoverage = ground footprints ÷ site area;
volumeRatio = gross volume ÷ site area (BMZ).number
required
HeightCapRule
interface HeightCapRule {
kind: 'height-cap';
id: string;
max: number;
}
"height-cap"
required
string
required
number
required
Metres above grade (the site elevation).
SeparationRule
interface SeparationRule {
kind: 'separation';
id: string;
min: number;
}
"separation"
required
string
required
number
required
Minimum clear distance between two masses whose vertical ranges overlap, metres.