{"version":3,"sources":["components/Header.tsx","api.ts","tilesets.ts","types.ts","constants.ts","utils.ts","components/Container.tsx","components/DrawStyles.tsx","components/LayersControl.tsx","components/LayersLegend.tsx","components/DataGroup.tsx","components/SectionTitle.tsx","components/StyledButton.tsx","components/StyledInput.tsx","components/LayoutGeneratorControl.tsx","components/LocationIndicator.tsx","components/LspInfo.tsx","components/LspResultShow.tsx","components/LspResultViewer.tsx","components/MapBoxMapHelper.tsx","components/SlopeMask.tsx","components/TilesetsHelper.tsx","components/MapBoxMap.tsx","App.tsx","index.tsx"],"names":["HeaderContainer","styled","div","LeftContainer","Brand","PoweredByAttributionContainer","Logo","img","RightContainer","ContactUsButton","Button","Header","size","onClick","window","open","href","target","rel","src","alt","API_LOCATION","process","console","log","TilesetName","ApiError","message","actualProto","prototype","Object","setPrototypeOf","Error","runSeedLayoutGenerator","polygonWkt","turbineMaxCapacity","setAdvancedSettings","turbineMW","diameter","ellipseMajor","ellipseMinor","ellipseRotation","a","fetch","method","body","JSON","stringify","boundaries","constraints","auto_set_turbine_settings","ellipse_base_diameter","ellipse_major","ellipse_minor","ellipse_rotation","turbine_max_capacity","turbine_capacity","response","json","ok","detail","runSeedLayoutGeneratorWithAdvancedHeuristics","superfuncA","superfuncB","superfuncC","superfuncMultiplier","slopefuncDropSteepness","slopefuncHalfPoint","proximityMultiplier","proximityPower","wakeMaxDownwindDistancePerDiameter","wakeK","wakeCt","elevationAreaFactor","elevationPowerFactor","elevationOverallFactor","superfunc_a","superfunc_b","superfunc_c","superfunc_multiplier","slopefunc_drop_steepness","slopefunc_half_point","proximity_multiplier","proximity_power","wake_max_downwind_distance_per_diameter","wake_k","wake_ct","elevation_area_factor","elevation_power_factor","elevation_overall_factor","sendKmlResults","name","email","points","getLspResults","query","URLSearchParams","toString","getLspResultsByPolygonFid","polygonFid","ApiState","WindSpeed100mTileset","tilesetSources","WindSpeed100m","type","tiles","tilesetLayers","id","source","layout","visibility","paint","WindSpeed150mTileset","WindSpeed150m","MapboxSatelliteTileset","MapboxSatellite","url","PrimaryRoadContourTileset","PrimaryRoadContour","MapboxStreets","filter","SecondaryRoadContourTileset","SecondaryRoadContour","TertiaryRoadContourTileset","TertiaryRoadContour","SubstationsProximityTileset","SubstationsProximity","SubstationLocationsTileset","SubstationLocations","PopulationDensityTileset","PopulationDensity","CountryBoundariesTileset","CountryBoundaries","WDPATileset","WDPA","BathymetryTileset","Bathymetry","minzoom","ShippingLanesTileset","ShippingLanes","LandUseTileset","LandUse","USWindFarmsTileset","USWindFarms","data","SeaPortsTileset","SeaPorts","TerrainSlopeSeventeenDegMaskTileset","TerrainSlopeSeventeenDegMask","TyphoonTracksTileset","TyphoonTracks","LspExclusionTileset","LspExclusion","TilesetCategory","UiType","initialSlgForm","windFarmName","maxCapacity","mw","RASTER_LAYER_OPTIONS","layerName","tilesetCategory","BaseLayer","uiType","Radio","uiGroupName","Resource","tooltip","Roads","VECTOR_LAYER_OPTIONS","EnviroSocial","Checkbox","Technical","LAYER_TILESET_MAPPING","LAYERS_LEGEND_MAPPING","title","items","color","desc","AREA_THRESHOLD","DEFAULT_LNG","DEFAULT_LAT","LSP_LAYER_SETTINGS","windSpeed","column","lowFill","highFill","lowScore","highScore","protectedArea","landUse","elevation","slope","total","LSP_SOURCE_LAYERS","output_contours_id_0","getEllipsePoint","theta","majorRadius","minorRadius","ellipseAngle","basePointX","basePointY","r","Math","hypot","cos","sin","headingTheta","PI","getEllipse","centerLngLat","baseDiameter","majorAxis","minorAxis","rotation","numPoints","fromLatLon","easting","northing","zoneNum","zoneLetter","Array","keys","map","i","toLatLon","latitude","longitude","getTurbineSvg","turbineTemplate","document","createElement","innerHTML","turbineSvg","content","firstChild","style","maxWidth","addTurbinesToMap","ellipseConfig","showPopup","markers","entries","idx","point","marker","mapboxgl","Marker","element","anchor","offset","setLngLat","x","y","popupText","ws","toFixed","setPopup","Popup","setText","addTo","togglePopup","push","undefined","ellipseSourceId","ellipseSourceIdNaming","ellipse","ellipseBaseDiameter","addSource","polygon","concat","addLayer","Container","fontSize","fontWeight","minWidth","pointColor","lineColor","lineDashStyle","polygonFillColor","PointDrawStyle","LineDrawStyle","PolygonDrawStyle","SectionTitle","OptionLabel","label","OptionValue","span","TooltipElement","LayersControl","loading","rasterOptions","vectorOptions","initialRasterOptions","selectedVectorOptions","onSelectRaster","onToggleVector","useState","fromEntries","opt","selectedRasterOptions","setSelectedRasterOptions","selectedVectorOptionNames","renderTooltip","option","placement","renderRasterOption","htmlFor","onChange","prevLayerOption","onToggleRasterRadioGroup","disabled","checked","renderVectorOption","event","includes","sectionTitleTilesetCategoryPairs","sectionTitle","Fragment","length","LayersLegendFloatingContainer","LayerLegend","LayerLegendTitle","LayerLegendItemContainer","LayerLegendItemColorIndicator","LayersLegend","configs","config","entry","backgroundColor","DataGroup","StyledButton","StyledInput","Input","SeedLayoutGeneratorForm","ProjectBoundaryDescription","LayoutGeneratorControl","slgButton","onStartAction","onResetAction","onRunAction","onSendEmailAction","drawMode","slgForm","setSlgForm","slgApiState","sendEmailApiState","polygonDrawn","apiData","useAdvancedHeuristics","showEmailBox","setShowEmailBox","READY","ERROR","FINISHED","LOADING","sendEmailButton","canRunSlg","polygonArea","area","maxTurbineCapacityAllowed","Number","value","key","some","k","sentData","turbineName","result","turbineCapacity","averageWindSpeed","capacityFactor","LocationIndicatorContainer","LocationIndicator","lng","lat","zoom","PolygonIdStyledInput","getRandomNumber","seed","lowerBound","upperBound","t","imul","LspInfoLine","strong","gutterBottom","LspInfoKey","PROTECTED_AREA_TOOLTIP","LAND_USE_TOOLTIP","ELEVATION_TOOLTIP","SLOPE_TOOLTIP","LspInfoTooltip","text","LspInfo","lspPolygonId","setLspPolygonId","lspSelectedData","mapBoxMap","useEffect","setCenter","reduce","acc","curr","c","setZoom","kml","lon","join","ws_slope_score","protected_areas_score","land_use_score","elevation_score","slope_score","total_score","mws","trunc","saveAs","Blob","OptionGroup","Subtitle","h4","LspResultShow","typeSelected","setTypeSelected","layerIds","setLayerIds","lspLoading","setLspLoading","setNotLoading","on","getSource","sourceLayer","getLayer","removeLayer","off","ids","LspResultViewer","shownIndex","setShownIndex","lspResults","setLspResults","markerPointsRef","useRef","res","limit","nextLspResults","originalLspResults","current","remove","geometry","coordinates","properties","display","copyTextToClipboard","navigator","clipboard","writeText","then","err","error","textArea","top","left","position","appendChild","focus","select","successful","execCommand","msg","removeChild","fallbackCopyTextToClipboard","SlopeMask","min","setMin","max","setMax","currentActiveLayer","setCurrentActiveLayer","step","removeSource","toggleTilesetVisibility","tilesetOption","tilesetLayer","setLayoutProperty","accessToken","MapContainer","LeftPanel","DiscoverBox","noMarginLeft","MapBoxMap","mapContainerRef","mapRef","mapBoxDrawRef","MapBoxDraw","displayControlsDefault","defaultMode","styles","modes","do_nothing","toDisplayFeatures","state","geojson","ellipseSourceIdsRef","getTilesetVisibility","activeVectorLayer","setActiveVectorLayer","visibleLegendConfigs","setVisibleLegendConfigs","setDrawMode","setSlgApiState","setSendEmailApiState","setPolygonDrawn","setApiData","setUseAdvancedHeuristics","callback","e","code","h","addEventListener","removeEventListener","setLng","setLat","setLoading","setLspSelectedData","supported","alert","Map","container","center","attributionControl","addControl","AttributionControl","customAttribution","ScaleControl","tileSize","maxzoom","setTerrain","exaggeration","loadImage","addImage","values","tilesetSourceName","tilesetSource","features","lngLat","getZoom","mode","numFeatures","getAll","updateFeaturesDrawn","hasControl","changeMode","removeFeatureState","setFeatureState","selected","lspCurrentPolygonMarkersRef","lspResultsForPolygon","clearResults","useCallback","sourceId","clearState","deleteAll","removeControl","toggleLegendVisibility","selectedOption","unselectedOption","nextVisibleLegendConfigs","legendConfig","wkt","_","sentPolygon","turbine_class_message","turbine_name","capacity_factor","isCheck","nextActiveVectorLayers","textAlign","ref","Content","App","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.bb85b90e.chunk.js","sourcesContent":["import { Button } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nconst HeaderContainer = styled.div`\n background-color: rgba(35, 55, 75);\n color: #ffffff;\n z-index: 1;\n width: 100vw;\n height: 40px;\n display: flex;\n justify-content: space-between;\n`;\n\nconst LeftContainer = styled.div`\n padding: 4px 12px;\n display: flex;\n`;\n\nconst Brand = styled.div`\n font-size: 22px;\n margin-left: 8px;\n align-self: center;\n user-select: none;\n text-transform: uppercase;\n font-family: \"Blender Pro Medium\", \"Barlow\", sans-serif;\n font-weight: 400;\n`;\n\nconst PoweredByAttributionContainer = styled.div`\n height: 29px;\n align-self: center;\n justify-content: center;\n display: flex;\n flex-direction: column;\n`;\n\n// const PoweredByAttributionText = styled.div`\n// font-family: 'Blender Pro Medium', 'Barlow', sans-serif;\n// font-size: 10px;\n// text-align: center;\n// text-transform: uppercase;\n// user-select: none;\n// `;\n\nconst Logo = styled.img`\n height: 18px;\n`;\n\nconst RightContainer = styled.div`\n padding: 4px 12px;\n display: flex;\n`;\n\nconst ContactUsButton = styled(Button)`\n align-self: center;\n margin-right: 18px;\n font-weight: 500;\n border: 0;\n width: 100px;\n\n &:hover {\n background-color: #0077d8;\n color: #fff;\n border: 0;\n }\n`;\n\nconst Header: React.FC = () => {\n return (\n \n \n WindDesk Discover\n \n \n \n window.open(\"https://www.traverse.ai/about-us/contact\")\n }\n >\n Get in Touch\n \n \n {/* A Project By */}\n \n \n \n \n \n \n );\n};\n\nexport default Header;\n","import {\n GeneratedLayoutResultPoint,\n GetLspResultsQueryParams,\n LspResult,\n} from \"./types\";\n\nconst API_LOCATION =\n process.env.REACT_APP_API_LOCATION || \"https://slg.traverse.ai\";\n\n// eslint-disable-next-line\nconsole.log(process.env.REACT_APP_API_LOCATION);\n\nexport class ApiError extends Error {\n constructor(message?: string) {\n // https://stackoverflow.com/a/48342359\n super(message);\n const actualProto = new.target.prototype;\n Object.setPrototypeOf(this, actualProto);\n }\n}\n\nexport interface GeneratedLayoutResult {\n points: GeneratedLayoutResultPoint[];\n message: string;\n turbine_name: string;\n turbine_class_message: string;\n turbine_capacity: number;\n ellipse_base_diameter: number;\n ellipse_major: number;\n ellipse_minor: number;\n ellipse_rotation: number;\n capacity_factor: number;\n}\n\nexport const runSeedLayoutGenerator = async (\n polygonWkt: string,\n turbineMaxCapacity: number,\n setAdvancedSettings: boolean,\n turbineMW?: number,\n diameter?: number,\n ellipseMajor?: number,\n ellipseMinor?: number,\n ellipseRotation?: number\n): Promise => {\n const response = await fetch(`${API_LOCATION}/v1/seed_layouts/`, {\n method: \"POST\",\n body: JSON.stringify({\n boundaries: [polygonWkt],\n constraints: [],\n auto_set_turbine_settings: !setAdvancedSettings,\n ellipse_base_diameter: diameter,\n ellipse_major: ellipseMajor,\n ellipse_minor: ellipseMinor,\n ellipse_rotation: ellipseRotation,\n turbine_max_capacity: turbineMaxCapacity,\n turbine_capacity: turbineMW,\n }),\n });\n const json = await response.json();\n if (!response.ok) {\n throw new ApiError(json.detail);\n }\n return json;\n};\n\nexport const runSeedLayoutGeneratorWithAdvancedHeuristics = async (\n polygonWkt: string,\n turbineMaxCapacity: number,\n setAdvancedSettings: boolean,\n superfuncA: number,\n superfuncB: number,\n superfuncC: number,\n superfuncMultiplier: number,\n slopefuncDropSteepness: number,\n slopefuncHalfPoint: number,\n proximityMultiplier: number,\n proximityPower: number,\n wakeMaxDownwindDistancePerDiameter: number,\n wakeK: number,\n wakeCt: number,\n elevationAreaFactor: number,\n elevationPowerFactor: number,\n elevationOverallFactor: number,\n turbineMW?: number,\n diameter?: number,\n ellipseMajor?: number,\n ellipseMinor?: number,\n ellipseRotation?: number\n): Promise => {\n const response = await fetch(`${API_LOCATION}/v1/seed_layouts/advanced`, {\n method: \"POST\",\n body: JSON.stringify({\n boundaries: [polygonWkt],\n constraints: [],\n auto_set_turbine_settings: !setAdvancedSettings,\n ellipse_base_diameter: diameter,\n ellipse_major: ellipseMajor,\n ellipse_minor: ellipseMinor,\n ellipse_rotation: ellipseRotation,\n turbine_max_capacity: turbineMaxCapacity,\n turbine_capacity: turbineMW,\n superfunc_a: superfuncA,\n superfunc_b: superfuncB,\n superfunc_c: superfuncC,\n superfunc_multiplier: superfuncMultiplier,\n slopefunc_drop_steepness: slopefuncDropSteepness,\n slopefunc_half_point: slopefuncHalfPoint,\n proximity_multiplier: proximityMultiplier,\n proximity_power: proximityPower,\n wake_max_downwind_distance_per_diameter:\n wakeMaxDownwindDistancePerDiameter,\n wake_k: wakeK,\n wake_ct: wakeCt,\n elevation_area_factor: elevationAreaFactor,\n elevation_power_factor: elevationPowerFactor,\n elevation_overall_factor: elevationOverallFactor,\n }),\n });\n const json = await response.json();\n if (!response.ok) {\n throw new ApiError(json.detail);\n }\n return json;\n};\n\nexport const sendKmlResults = async (\n polygonWkt: string,\n name: string,\n turbineMaxCapacity: number,\n setAdvancedSettings: boolean,\n message: string,\n email: string,\n points: GeneratedLayoutResultPoint[],\n turbineMW?: number,\n diameter?: number,\n ellipseMajor?: number,\n ellipseMinor?: number,\n ellipseRotation?: number\n): Promise<[string, [number, number, number][]]> => {\n const response = await fetch(`${API_LOCATION}/v1/seed_layouts/email`, {\n method: \"POST\",\n body: JSON.stringify({\n name,\n boundaries: [polygonWkt],\n constraints: [],\n auto_set_turbine_settings: !setAdvancedSettings,\n ellipse_base_diameter: diameter,\n ellipse_major: ellipseMajor,\n ellipse_minor: ellipseMinor,\n ellipse_rotation: ellipseRotation,\n turbine_max_capacity: turbineMaxCapacity,\n turbine_capacity: turbineMW,\n message,\n email,\n points,\n }),\n });\n const json = await response.json();\n if (!response.ok) {\n throw new ApiError(json.detail);\n }\n return json;\n};\n\nexport const getLspResults = async (\n query: GetLspResultsQueryParams = {}\n): Promise => {\n const response = await fetch(\n `${API_LOCATION}/v1/seed_layouts/lsp_results?${new URLSearchParams(\n query\n ).toString()}`\n );\n const json = await response.json();\n if (!response.ok) {\n throw new ApiError(json.detail);\n }\n return json;\n};\n\nexport const getLspResultsByPolygonFid = async (\n polygonFid: number\n): Promise => {\n const response = await fetch(\n `${API_LOCATION}/v1/seed_layouts/lsp_results/${polygonFid}`\n );\n const json = await response.json();\n if (!response.ok) {\n throw new ApiError(json.detail);\n }\n return json;\n};\n","import {\n FillLayer,\n GeoJSONSourceRaw,\n LineLayer,\n RasterLayer,\n RasterSource,\n SymbolLayer,\n VectorSource,\n} from \"mapbox-gl\";\n\nexport enum TilesetName {\n // Rasters\n WindSpeed100m = \"wind-speed-100m\",\n WindSpeed150m = \"wind-speed-150m\",\n MapboxSatellite = \"mapbox-satellite\",\n LandUse = \"land-use\",\n\n // Vectors\n CountryBoundaries = \"contour\",\n PrimaryRoadContour = \"primary-road-contour\",\n SecondaryRoadContour = \"secondary-road-contour\",\n TertiaryRoadContour = \"tertiary-road-contour\",\n PopulationDensity = \"population-density\",\n SubstationsProximity = \"distance-to-substation\",\n SubstationLocations = \"substation-locations\",\n WDPA = \"WDPA\",\n SeaPorts = \"sea-ports\",\n ShippingLanes = \"shipping-lanes\",\n Bathymetry = \"bathymetry\",\n TerrainSlopeSeventeenDegMask = \"terrain-slope-seventeen-deg-mask\",\n MapboxStreets = \"mapbox-streets\",\n TyphoonTracks = \"typhoon-tracks\",\n\n USWindFarms = \"us-wind-farms\",\n LspExclusion = \"lsp-exclusion\",\n LspFill = \"lsp-fill\",\n}\n\nexport interface TilesetOption {\n tilesetSources: Record<\n string,\n VectorSource | RasterSource | GeoJSONSourceRaw\n >;\n tilesetLayers: (RasterLayer | LineLayer | FillLayer | SymbolLayer)[];\n}\n\nexport const WindSpeed100mTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.WindSpeed100m]: {\n type: \"raster\",\n tiles: [\n \"https://terracotta.traverse.ai/singleband/continuous/mws/gwa3/250/100/{z}/{x}/{y}.png?colormap=traverse&stretch_range=[0.5,11.5]\",\n ],\n },\n [`${TilesetName.WindSpeed100m}_contour`]: {\n type: \"vector\",\n tiles: [\n \"https://tegola.traverse.ai/maps/mws_100m/{z}/{x}/{y}.vector.pbf\",\n ],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.WindSpeed100m}_raster`,\n type: \"raster\",\n source: TilesetName.WindSpeed100m,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: `${TilesetName.WindSpeed100m}_contour`,\n type: \"line\",\n source: `${TilesetName.WindSpeed100m}_contour`,\n \"source-layer\": \"main_layer\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-opacity\": [\n \"case\",\n [\"<\", [\"to-number\", [\"get\", \"ELEV_STR\"]], 5],\n 0,\n 1,\n ],\n },\n },\n {\n id: `${TilesetName.WindSpeed100m}_contour_mws`,\n type: \"symbol\",\n source: `${TilesetName.WindSpeed100m}_contour`,\n \"source-layer\": \"main_layer\",\n layout: {\n \"text-field\": [\"concat\", [\"get\", \"ELEV_STR\"], \"m/s\"],\n \"text-size\": 20,\n \"text-justify\": \"auto\",\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n \"text-opacity\": [\n \"case\",\n [\"<\", [\"to-number\", [\"get\", \"ELEV_STR\"]], 5],\n 0,\n [\"<\", [\"%\", [\"round\", [\"get\", \"ELEV_STR\"]], 10], 1],\n 1,\n 0,\n ],\n },\n },\n ],\n};\n\nexport const WindSpeed150mTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.WindSpeed150m]: {\n type: \"raster\",\n tiles: [\n \"https://terracotta.traverse.ai/singleband/continuous/mws/gwa3/250/150/{z}/{x}/{y}.png?colormap=traverse&stretch_range=[0.5,11.5]\",\n ],\n },\n [`${TilesetName.WindSpeed150m}_contour`]: {\n type: \"vector\",\n tiles: [\n \"https://tegola.traverse.ai/maps/mws_150m/{z}/{x}/{y}.vector.pbf\",\n ],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.WindSpeed150m}_raster`,\n type: \"raster\",\n source: TilesetName.WindSpeed150m,\n \"source-layer\": \"gwa3_sea_100_wind-speed_150m-2jgqg3\",\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: `${TilesetName.WindSpeed150m}_contour`,\n type: \"line\",\n source: `${TilesetName.WindSpeed150m}_contour`,\n \"source-layer\": \"main_layer\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-opacity\": [\n \"case\",\n [\"<\", [\"to-number\", [\"get\", \"ELEV_STR\"]], 5],\n 0,\n 1,\n ],\n },\n },\n {\n id: `${TilesetName.WindSpeed150m}_contour_mws`,\n type: \"symbol\",\n source: `${TilesetName.WindSpeed150m}_contour`,\n \"source-layer\": \"main_layer\",\n layout: {\n \"text-field\": [\"concat\", [\"get\", \"ELEV_STR\"], \"m/s\"],\n \"text-size\": 20,\n \"text-justify\": \"auto\",\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n \"text-opacity\": [\n \"case\",\n [\"<\", [\"to-number\", [\"get\", \"ELEV_STR\"]], 5],\n 0,\n [\"<\", [\"%\", [\"round\", [\"get\", \"ELEV_STR\"]], 10], 1],\n 1,\n 0,\n ],\n },\n },\n ],\n};\n\nexport const MapboxSatelliteTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.MapboxSatellite]: {\n type: \"raster\",\n url: \"mapbox://mapbox.satellite\",\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.MapboxSatellite}_raster`,\n type: \"raster\",\n source: TilesetName.MapboxSatellite,\n layout: {\n visibility: \"none\",\n },\n },\n ],\n};\n\nexport const PrimaryRoadContourTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.PrimaryRoadContour]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.b4timknp\",\n },\n [`${TilesetName.MapboxStreets}_primary`]: {\n type: \"vector\",\n url: \"mapbox://mapbox.mapbox-streets-v8\",\n },\n },\n tilesetLayers: [\n {\n id: TilesetName.PrimaryRoadContour,\n type: \"line\",\n source: TilesetName.PrimaryRoadContour,\n \"source-layer\": \"primary_in_km_contours-5yodf0\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\n \"step\",\n [\"get\", \"DIST\"],\n \"#1a9641\",\n 10,\n \"#0088ff\",\n 20,\n \"#ff9100\",\n 50,\n \"#ff61ff\",\n 100,\n \"#d7191c\",\n ],\n \"line-width\": 3,\n },\n },\n {\n id: `${TilesetName.MapboxStreets}_primary`,\n source: `${TilesetName.MapboxStreets}_primary`,\n \"source-layer\": \"road\",\n type: \"line\",\n layout: {\n visibility: \"none\",\n },\n filter: [\"in\", [\"get\", \"class\"], [\"literal\", [\"primary\"]]],\n },\n ],\n};\n\nexport const SecondaryRoadContourTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.SecondaryRoadContour]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.0iebjcla\",\n },\n [`${TilesetName.MapboxStreets}_secondary`]: {\n type: \"vector\",\n url: \"mapbox://mapbox.mapbox-streets-v8\",\n },\n },\n tilesetLayers: [\n {\n id: TilesetName.SecondaryRoadContour,\n type: \"line\",\n source: TilesetName.SecondaryRoadContour,\n \"source-layer\": \"secondary_in_km_contours-9ix06d\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\n \"step\",\n [\"get\", \"DIST\"],\n \"#1a9641\",\n 10,\n \"#0088ff\",\n 20,\n \"#ff9100\",\n 50,\n \"#ff61ff\",\n 100,\n \"#d7191c\",\n ],\n \"line-width\": 3,\n },\n },\n {\n id: `${TilesetName.MapboxStreets}_secondary`,\n source: `${TilesetName.MapboxStreets}_secondary`,\n \"source-layer\": \"road\",\n type: \"line\",\n layout: {\n visibility: \"none\",\n },\n filter: [\"in\", [\"get\", \"class\"], [\"literal\", [\"primary\", \"secondary\"]]],\n },\n ],\n};\n\nexport const TertiaryRoadContourTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.TertiaryRoadContour]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.3qekaxg1\",\n },\n [`${TilesetName.MapboxStreets}_tertiary`]: {\n type: \"vector\",\n url: \"mapbox://mapbox.mapbox-streets-v8\",\n },\n },\n tilesetLayers: [\n {\n id: TilesetName.TertiaryRoadContour,\n type: \"line\",\n source: TilesetName.TertiaryRoadContour,\n \"source-layer\": \"tertiary_in_km_contours-3te7pw\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\n \"step\",\n [\"get\", \"DIST\"],\n \"#1a9641\",\n 10,\n \"#0088ff\",\n 20,\n \"#ff9100\",\n 50,\n \"#ff61ff\",\n 100,\n \"#d7191c\",\n ],\n \"line-width\": 3,\n },\n },\n {\n id: `${TilesetName.MapboxStreets}_tertiary`,\n source: `${TilesetName.MapboxStreets}_tertiary`,\n \"source-layer\": \"road\",\n type: \"line\",\n layout: {\n visibility: \"none\",\n },\n filter: [\n \"in\",\n [\"get\", \"class\"],\n [\"literal\", [\"primary\", \"secondary\", \"tertiary\"]],\n ],\n },\n ],\n};\n\nexport const SubstationsProximityTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.SubstationsProximity]: {\n type: \"vector\",\n tiles: [\n \"https://tegola.traverse.ai/maps/substation_proximity_v2/{z}/{x}/{y}.vector.pbf?\",\n ],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.SubstationsProximity}_vector`,\n type: \"line\",\n source: TilesetName.SubstationsProximity,\n \"source-layer\": \"proximity\",\n layout: {\n \"line-join\": \"round\",\n \"line-cap\": \"round\",\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\n \"case\",\n [\"<=\", [\"get\", \"DIST\"], 10],\n \"#1a9850\",\n [\"<=\", [\"get\", \"DIST\"], 30],\n \"#3288bd\",\n [\"<=\", [\"get\", \"DIST\"], 50],\n \"#f46d43\",\n \"#d73027\",\n ],\n \"line-opacity\": [\n \"case\",\n [\"<\", [\"%\", [\"round\", [\"get\", \"DIST\"]], 10], 1],\n 1,\n 0,\n ],\n \"line-width\": 3,\n },\n },\n {\n id: `${TilesetName.SubstationsProximity}_distance`,\n type: \"symbol\",\n source: TilesetName.SubstationsProximity,\n \"source-layer\": \"proximity\",\n layout: {\n \"text-field\": [\"concat\", [\"get\", \"DIST\"], \"km\"],\n \"text-size\": 20,\n \"text-justify\": \"auto\",\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n \"text-opacity\": [\n \"case\",\n [\"<\", [\"%\", [\"round\", [\"get\", \"DIST\"]], 10], 1],\n 1,\n 0,\n ],\n },\n },\n ],\n};\n\nexport const SubstationLocationsTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.SubstationLocations]: {\n type: \"vector\",\n tiles: [\n \"https://tegola.traverse.ai/maps/substation_locations_v1/{z}/{x}/{y}.vector.pbf?debug=true\",\n ],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.SubstationLocations}_icon`,\n type: \"symbol\",\n source: TilesetName.SubstationLocations,\n \"source-layer\": \"substation_locations\",\n layout: {\n \"text-line-height\": 1,\n \"text-padding\": 0,\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": true,\n \"text-ignore-placement\": true,\n \"text-field\": \"\",\n \"text-font\": [\"Font Awesome 5 Pro Solid\", \"Arial Unicode MS Regular\"],\n \"text-size\": 24,\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#134863\",\n },\n },\n {\n id: `${TilesetName.SubstationLocations}_text`,\n type: \"symbol\",\n source: TilesetName.SubstationLocations,\n \"source-layer\": \"substation_locations\",\n layout: {\n \"text-field\": [\n \"format\",\n [\"case\", [\"!=\", [\"get\", \"name\"], \"\"], [\"get\", \"name\"], [\"get\", \"id\"]],\n {},\n \"\\n\",\n {},\n [\n \"case\",\n [\"!=\", [\"get\", \"operator\"], \"\"],\n [\"concat\", \"[Operator | \", [\"get\", \"operator\"], \"]\\n\"],\n \"\",\n ],\n { \"font-scale\": 0.7 },\n [\n \"case\",\n [\"!=\", [\"get\", \"voltage\"], \"\"],\n [\"concat\", \"[Voltage | \", [\"get\", \"voltage\"], \"]\\n\"],\n \"\",\n ],\n { \"font-scale\": 0.7 },\n [\n \"case\",\n [\"!=\", [\"get\", \"substation_type\"], \"\"],\n [\n \"concat\",\n \"[Type | \",\n [\"upcase\", [\"slice\", [\"get\", \"substation_type\"], 0, 1]],\n [\n \"slice\",\n [\"get\", \"substation_type\"],\n 1,\n [\"length\", [\"get\", \"substation_type\"]],\n ],\n \"]\",\n ],\n \"\",\n ],\n { \"font-scale\": 0.7 },\n ],\n \"text-size\": 15,\n \"text-anchor\": \"top-left\",\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n },\n },\n ],\n};\n\nexport const PopulationDensityTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.PopulationDensity]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.dnzpeszo\",\n },\n },\n tilesetLayers: [\n {\n id: TilesetName.PopulationDensity,\n type: \"line\",\n source: TilesetName.PopulationDensity,\n \"source-layer\": \"population_density_25km_conto-4s8s7o\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\n \"case\",\n [\"<\", [\"get\", \"DIST\"], 0],\n \"#d73028\",\n [\"<\", [\"get\", \"DIST\"], 50],\n \"#1a9850\",\n [\"<\", [\"get\", \"DIST\"], 100],\n \"#2166ab\",\n [\"<\", [\"get\", \"DIST\"], 150],\n \"#fdb863\",\n [\"<\", [\"get\", \"DIST\"], 200],\n \"#542788\",\n \"#d73027\",\n ],\n \"line-width\": 3,\n },\n },\n ],\n};\n\nexport const CountryBoundariesTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.CountryBoundaries]: {\n type: \"vector\",\n url: \"mapbox://mapbox.country-boundaries-v1\",\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.CountryBoundaries}_vector`,\n type: \"line\",\n source: TilesetName.CountryBoundaries,\n \"source-layer\": \"country_boundaries\",\n layout: {\n visibility: \"none\",\n },\n paint: {\n \"line-color\": \"#fff\",\n \"line-width\": 3,\n \"line-dasharray\": [6.0, 2.0],\n },\n },\n ],\n};\n\nexport const WDPATileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.WDPA]: {\n type: \"vector\",\n tiles: [\"https://tegola.traverse.ai/maps/wdpa/{z}/{x}/{y}.vector.pbf\"],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.WDPA}_vector`,\n type: \"line\",\n source: TilesetName.WDPA,\n \"source-layer\": \"main_layer\",\n layout: {\n visibility: \"none\",\n },\n paint: {\n \"line-color\": \"#00ffff\",\n \"line-width\": 3,\n },\n },\n {\n id: `${TilesetName.WDPA}_name`,\n type: \"symbol\",\n source: TilesetName.WDPA,\n \"source-layer\": \"main_layer\",\n layout: {\n \"text-field\": [\n \"concat\",\n [\"get\", \"NAME\"],\n \" \\n[\",\n [\"get\", \"DESIG_ENG\"],\n \"]\",\n ],\n \"text-size\": 12,\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n },\n },\n ],\n};\n\nexport const BathymetryTileset: TilesetOption = {\n tilesetSources: {\n [`${TilesetName.Bathymetry}_raster`]: {\n type: \"raster\",\n url: \"mapbox://thetlinthu.8iv7w99s\",\n },\n [`${TilesetName.Bathymetry}_contour`]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.66bbegl7\",\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.Bathymetry}_raster`,\n type: \"raster\",\n source: `${TilesetName.Bathymetry}_raster`,\n \"source-layer\": \"global_bathy-a2cxxy\",\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: `${TilesetName.Bathymetry}_contour`,\n type: \"line\",\n source: `${TilesetName.Bathymetry}_contour`,\n minzoom: 7,\n \"source-layer\": \"gebco2020_lt0_gtNeg300_10mInt-25wd55\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-color\": \"#ff0000\",\n \"line-width\": 2,\n },\n },\n {\n id: `${TilesetName.Bathymetry}_elev`,\n type: \"symbol\",\n source: `${TilesetName.Bathymetry}_contour`,\n minzoom: 7,\n \"source-layer\": \"gebco2020_lt0_gtNeg300_10mInt-25wd55\",\n layout: {\n \"text-field\": [\"concat\", [\"get\", \"ELEV\"], \"m\"],\n \"text-size\": 18,\n \"text-justify\": \"auto\",\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#fff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n },\n },\n ],\n};\n\nexport const ShippingLanesTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.ShippingLanes]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.coi9yb56\",\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.ShippingLanes}_vector`,\n type: \"line\",\n source: TilesetName.ShippingLanes,\n \"source-layer\": \"shipping_routes_v2-blveiw\",\n layout: {\n visibility: \"none\",\n },\n paint: {\n \"line-color\": \"rgb(209,250,217)\",\n },\n },\n ],\n};\n\nexport const LandUseTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.LandUse]: {\n type: \"raster\",\n tiles: [\n 'https://terracotta.traverse.ai/singleband/categorical/landuse/copernicus/100/0/{z}/{x}/{y}.png?colormap=explicit&explicit_color_map={\"0\": \"282828\", \"111\": \"58481f\", \"113\": \"70663e\", \"112\": \"009900\", \"114\": \"00cc00\", \"115\": \"4e751f\", \"116\": \"007800\", \"121\": \"666000\", \"123\": \"8d7400\", \"122\": \"8db400\", \"124\": \"a0dc00\", \"125\": \"929900\", \"126\": \"648c00\", \"20\": \"ffbb22\", \"30\": \"ffff4c\", \"90\": \"0096a0\", \"100\": \"fae6a0\", \"60\": \"b4b4b4\", \"40\": \"f096ff\", \"50\": \"fa0000\", \"70\": \"f0f0f0\", \"80\": \"0032c8\", \"200\": \"000080\"}',\n ],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.LandUse}_raster`,\n type: \"raster\",\n source: TilesetName.LandUse,\n layout: {\n visibility: \"none\",\n },\n },\n ],\n};\n\nexport const USWindFarmsTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.USWindFarms]: {\n type: \"geojson\",\n data: \"./uswtdb_v4_1_20210721.geojson\",\n },\n [`${TilesetName.USWindFarms}_convex_hull`]: {\n type: \"geojson\",\n data: \"./uswtdb_v4_1_20210721_convex_hulls.geojson\",\n },\n },\n tilesetLayers: [\n {\n id: TilesetName.USWindFarms,\n type: \"symbol\",\n source: TilesetName.USWindFarms,\n layout: {\n \"icon-allow-overlap\": true,\n \"icon-ignore-placement\": true,\n \"icon-image\": \"turbine\",\n \"icon-size\": 0.1,\n visibility: \"none\",\n },\n },\n {\n id: `${TilesetName.USWindFarms}_name`,\n type: \"symbol\",\n source: `${TilesetName.USWindFarms}_convex_hull`,\n layout: {\n \"text-field\": [\"get\", \"p_name\"],\n \"text-size\": 12,\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n },\n },\n {\n id: `${TilesetName.USWindFarms}_convex_hull`,\n type: \"line\",\n source: `${TilesetName.USWindFarms}_convex_hull`,\n layout: {\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\"get\", \"color\"],\n \"line-width\": 3,\n },\n },\n ],\n};\n\nexport const SeaPortsTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.SeaPorts]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.c3mk8nti\",\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.SeaPorts}_vector`,\n type: \"symbol\",\n source: TilesetName.SeaPorts,\n \"source-layer\": \"WPI_Shapefile-drel15\",\n layout: {\n \"text-line-height\": 1,\n \"text-padding\": 0,\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": true,\n \"text-ignore-placement\": true,\n \"text-field\": \"\",\n \"text-font\": [\"Font Awesome 5 Pro Solid\", \"Arial Unicode MS Regular\"],\n \"text-size\": 24,\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#134863\",\n },\n },\n {\n id: `${TilesetName.SeaPorts}_name`,\n type: \"symbol\",\n minzoom: 6,\n source: TilesetName.SeaPorts,\n \"source-layer\": \"WPI_Shapefile-drel15\",\n layout: {\n \"text-field\": [\n \"concat\",\n [\"get\", \"PORT_NAME\"],\n \"\\n[Harbor size | \",\n [\"get\", \"HARBORSIZE\"],\n \"]\",\n \"\\n[Max vessel Size | \",\n [\"get\", \"MAX_VESSEL\"],\n \"]\",\n ],\n \"text-size\": 15,\n \"text-anchor\": \"top-left\",\n visibility: \"none\",\n },\n paint: {\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 2,\n },\n },\n ],\n};\n\nexport const TerrainSlopeSeventeenDegMaskTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.TerrainSlopeSeventeenDegMask]: {\n type: \"raster\",\n tiles: [\n \"https://terracotta.traverse.ai/singleband/continuous/slope/nasadem/30/0/{z}/{x}/{y}.png?colormap=blacks&stretch_range=[17,30]\",\n ],\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.TerrainSlopeSeventeenDegMask}`,\n type: \"raster\",\n source: TilesetName.TerrainSlopeSeventeenDegMask,\n layout: {\n visibility: \"none\",\n },\n },\n ],\n};\n\nexport const TyphoonTracksTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.TyphoonTracks]: {\n type: \"vector\",\n url: \"mapbox://thetlinthu.8nga5yzz\",\n },\n },\n tilesetLayers: [\n {\n id: `${TilesetName.TyphoonTracks}`,\n type: \"line\",\n source: TilesetName.TyphoonTracks,\n \"source-layer\": \"cyclones_typhoon_hurricane-759fsj\",\n layout: {\n \"line-join\": \"miter\",\n \"line-cap\": \"butt\",\n \"line-miter-limit\": 2,\n visibility: \"none\",\n },\n paint: {\n \"line-color\": [\n \"step\",\n [\"get\", \"USA_SSHS\"],\n \"rgba(0, 0, 0, 0)\",\n 0,\n \"rgba(0, 0, 0, 0)\",\n 1,\n \"rgba(0, 0, 255, 1)\",\n 2,\n \"rgba(0, 255, 0, 1)\",\n 3,\n \"rgba(255, 0, 0, 1)\",\n ],\n \"line-width\": 2,\n },\n },\n ],\n};\n\nexport const LspExclusionTileset: TilesetOption = {\n tilesetSources: {\n [TilesetName.LspExclusion]: {\n type: \"raster\",\n tiles: [\n \"https://terracotta.traverse.ai/singleband/categorical/exclusion/generated/30/0/{z}/{x}/{y}.png?colormap=blacks&stretch_range=[0,2]\",\n ],\n },\n },\n tilesetLayers: [\n {\n id: TilesetName.LspExclusion,\n type: \"raster\",\n source: TilesetName.LspExclusion,\n layout: {\n visibility: \"none\",\n },\n },\n ],\n};\n","import { Feature } from \"geojson\";\n\nexport enum ApiState {\n READY,\n LOADING,\n FINISHED,\n ERROR,\n}\n\nexport type SlgForm = {\n setAdvancedSettings: boolean;\n windFarmName: string;\n maxCapacity: string;\n diameter: string;\n ellipseMajor: string;\n ellipseMinor: string;\n ellipseRotation: string;\n mw: string;\n email: string;\n superfuncA: string;\n superfuncB: string;\n superfuncC: string;\n superfuncMultiplier: string;\n slopefuncDropSteepness: string;\n slopefuncHalfPoint: string;\n proximityMultiplier: string;\n proximityPower: string;\n wakeMaxDownwindDistancePerDiameter: string;\n wakeK: string;\n wakeCt: string;\n elevationAreaFactor: string;\n elevationPowerFactor: string;\n elevationOverallFactor: string;\n};\n\nexport const initialSlgForm = {\n setAdvancedSettings: false,\n windFarmName: \"\",\n maxCapacity: \"\",\n diameter: \"\",\n ellipseMajor: \"\",\n ellipseMinor: \"\",\n ellipseRotation: \"\",\n mw: \"\",\n email: \"\",\n superfuncA: \"-361.09\",\n superfuncB: \"9934.9\",\n superfuncC: \"-29291\",\n superfuncMultiplier: \"1904\",\n slopefuncDropSteepness: \"0.4\",\n slopefuncHalfPoint: \"12\",\n proximityMultiplier: \"500\",\n proximityPower: \"1.1\",\n wakeMaxDownwindDistancePerDiameter: \"60\",\n wakeK: \"0.075\",\n wakeCt: \"0.75\",\n elevationAreaFactor: \"1.25\",\n elevationPowerFactor: \"1\",\n elevationOverallFactor: \"40\",\n};\n\nexport interface GeneratedLayoutResultPoint {\n x: number;\n y: number;\n ws: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport type SlgApiData = {\n sentData: SlgForm;\n sentPolygon: Feature;\n result: GeneratedLayoutResultPoint[];\n message: string;\n averageWindSpeed: number;\n turbineName: string;\n turbineCapacity: number;\n ellipseBaseDiameter: number;\n ellipseMajor: number;\n ellipseMinor: number;\n ellipseRotation: number;\n capacityFactor: number;\n};\n\nexport enum TilesetCategory {\n BaseLayer = \"baselayer\",\n EnviroSocial = \"envirosocial\",\n Resource = \"resource\",\n Roads = \"roads\",\n Technical = \"technical\",\n}\n\nexport enum UiType {\n Checkbox = \"checkbox\",\n Radio = \"radio\",\n}\n\nexport type LspResult = {\n polygon_fid: number;\n polygon: [number, number][];\n points: [number, number][];\n mws: number;\n ws_slope_score: number;\n protected_areas_score: number;\n land_use_score: number;\n elevation_score: number;\n slope_score: number;\n total_score: number;\n};\n\nexport type EllipseConfig = {\n ellipseSourceIdNaming: (idx: number) => string;\n ellipseBaseDiameter: number;\n ellipseMajor: number;\n ellipseMinor: number;\n ellipseRotation: number;\n};\n\nexport type GetLspResultsQueryParams = {\n limit?: string;\n offset?: string;\n};\n\nexport type ContourPolygonAttributes = {\n polygon_id: string;\n WS_SLOPE_SCORE: string;\n protected_areas_score: string;\n land_use_score: string;\n elevation_score: string;\n slope_score: string;\n total_score: string;\n};\n","import { LayerOption } from \"./components/LayersControl\";\nimport { LayerLegendConfig } from \"./components/LayersLegend\";\nimport {\n BathymetryTileset,\n CountryBoundariesTileset,\n LandUseTileset,\n LspExclusionTileset,\n MapboxSatelliteTileset,\n PopulationDensityTileset,\n PrimaryRoadContourTileset,\n SeaPortsTileset,\n SecondaryRoadContourTileset,\n ShippingLanesTileset,\n SubstationLocationsTileset,\n SubstationsProximityTileset,\n TerrainSlopeSeventeenDegMaskTileset,\n TertiaryRoadContourTileset,\n TilesetName,\n TilesetOption,\n TyphoonTracksTileset,\n USWindFarmsTileset,\n WDPATileset,\n WindSpeed100mTileset,\n WindSpeed150mTileset,\n} from \"./tilesets\";\nimport { TilesetCategory, UiType } from \"./types\";\n\nexport const RASTER_LAYER_OPTIONS: LayerOption[] = [\n {\n name: \"Elevation contours\",\n layerName: \"None\",\n tilesetCategory: TilesetCategory.BaseLayer,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-basemap\",\n },\n {\n name: \"Satellite\",\n layerName: TilesetName.MapboxSatellite,\n tilesetCategory: TilesetCategory.BaseLayer,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-basemap\",\n },\n {\n name: \"None\",\n layerName: \"None\",\n tilesetCategory: TilesetCategory.Resource,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-meanwindspeed\",\n },\n {\n name: \"Mean windspeed at 100m hub-height\",\n layerName: TilesetName.WindSpeed100m,\n tilesetCategory: TilesetCategory.Resource,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-meanwindspeed\",\n tooltip: \"Meters per second: Windspeed at 100m hub-height\",\n },\n {\n name: \"Mean windspeed at 150m hub-height\",\n layerName: TilesetName.WindSpeed150m,\n tilesetCategory: TilesetCategory.Resource,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-meanwindspeed\",\n tooltip: \"Meters per second: windspeed at 150m hub-height\",\n },\n {\n name: \"None\",\n layerName: \"None\",\n tilesetCategory: TilesetCategory.Roads,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-roads\",\n },\n {\n name: \"Road proximity (Primary)\",\n layerName: TilesetName.PrimaryRoadContour,\n tilesetCategory: TilesetCategory.Roads,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-roads\",\n tooltip: \"Kilometers from the nearest primary [4-lane] roads.\",\n },\n {\n name: \"Road proximity (Secondary)\",\n layerName: TilesetName.SecondaryRoadContour,\n tilesetCategory: TilesetCategory.Roads,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-roads\",\n tooltip:\n \"Kilometers from the nearest secondary AND primary [3,4 lane] roads.\",\n },\n {\n name: \"Road proximity (Tertiary)\",\n layerName: TilesetName.TertiaryRoadContour,\n tilesetCategory: TilesetCategory.Roads,\n uiType: UiType.Radio,\n uiGroupName: \"radio-tilesets-roads\",\n tooltip:\n \"Kilometers from the nearest tertiary AND secondary AND primary [2,3,4 lane] roads.\",\n },\n];\n\nexport const VECTOR_LAYER_OPTIONS: LayerOption[] = [\n {\n name: \"Country boundaries\",\n layerName: TilesetName.CountryBoundaries,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip:\n \"Dashed white line. Useful when colorful rasters such as windspeed are toggled.\",\n },\n {\n name: \"Population density\",\n layerName: TilesetName.PopulationDensity,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip:\n \"Kilometers from the nearest location that has a population density of 3,000 per km2.\",\n },\n {\n name: \"Substation proximity\",\n layerName: TilesetName.SubstationsProximity,\n tilesetCategory: TilesetCategory.Technical,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip: \"Kilometers from the nearest (non-distribution) sub-station.\",\n },\n {\n name: \"Substation locations\",\n layerName: TilesetName.SubstationLocations,\n tilesetCategory: TilesetCategory.Technical,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip: \"Name and description of substations (non-distribution).\",\n },\n // {\n // name: \"High slope zones\",\n // layerName: TilesetName.TerrainSlopeSeventeenDegMask,\n // tilesetCategory: TilesetCategory.Technical,\n // uiType: UiType.Checkbox,\n // uiGroupName: \"checkbox-tilesets-general\",\n // tooltip:\n // \"Zones of 17 degrees (31%) slope which is an indicator of difficult terrain for turbine placement.\",\n // },\n {\n name: \"Protected areas\",\n layerName: TilesetName.WDPA,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip: \"Zones of well known protected areas.\",\n },\n {\n name: \"Sea ports\",\n layerName: TilesetName.SeaPorts,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip: \"Global sea ports.\",\n },\n {\n name: \"Shipping lanes\",\n layerName: TilesetName.ShippingLanes,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip: \"Global shipping lanes.\",\n },\n {\n name: \"Typhoon tracks\",\n layerName: TilesetName.TyphoonTracks,\n tilesetCategory: TilesetCategory.Technical,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip:\n \"Tracks of historical typhoons color coded by the Saffir-Simpson scale.\",\n },\n {\n name: \"Bathymetry\",\n layerName: TilesetName.Bathymetry,\n tilesetCategory: TilesetCategory.Technical,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n tooltip: \"Global bathymetry of up to 500m water depth.\",\n },\n {\n name: \"Land use\",\n layerName: TilesetName.LandUse,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n },\n {\n name: \"LSP exclusion\",\n layerName: TilesetName.LspExclusion,\n tilesetCategory: TilesetCategory.EnviroSocial,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n },\n {\n name: \"US wind farms\",\n layerName: TilesetName.USWindFarms,\n tilesetCategory: TilesetCategory.Technical,\n uiType: UiType.Checkbox,\n uiGroupName: \"checkbox-tilesets-general\",\n },\n];\n\nexport const LAYER_TILESET_MAPPING: Record = {\n // THE ORDERING HERE MATTERS.\n // Place the RASTER tiles as first in queue.\n // Place any layers that have OPACITY second in queue. Such as fully or semi-opaque polygons.\n // Place transparent layers such as lines and no-fill polygons last.\n // It will automatically become the lowest layer.\n // We are adding all the layers upon load and setting visible True False\n // when the user toggles the checkbox.\n\n // Fully colored rasters.\n [TilesetName.MapboxSatellite]: MapboxSatelliteTileset,\n [TilesetName.WindSpeed100m]: WindSpeed100mTileset,\n [TilesetName.WindSpeed150m]: WindSpeed150mTileset,\n [TilesetName.LandUse]: LandUseTileset,\n [TilesetName.LspExclusion]: LspExclusionTileset,\n\n // Opaque or Semi Opaque vectors\n [TilesetName.TerrainSlopeSeventeenDegMask]:\n TerrainSlopeSeventeenDegMaskTileset,\n\n // Lines\n [TilesetName.CountryBoundaries]: CountryBoundariesTileset,\n [TilesetName.PopulationDensity]: PopulationDensityTileset,\n [TilesetName.PrimaryRoadContour]: PrimaryRoadContourTileset,\n [TilesetName.SecondaryRoadContour]: SecondaryRoadContourTileset,\n [TilesetName.SubstationsProximity]: SubstationsProximityTileset,\n [TilesetName.SubstationLocations]: SubstationLocationsTileset,\n [TilesetName.TertiaryRoadContour]: TertiaryRoadContourTileset,\n [TilesetName.SeaPorts]: SeaPortsTileset,\n [TilesetName.ShippingLanes]: ShippingLanesTileset,\n [TilesetName.Bathymetry]: BathymetryTileset,\n [TilesetName.WDPA]: WDPATileset,\n [TilesetName.USWindFarms]: USWindFarmsTileset,\n [TilesetName.TyphoonTracks]: TyphoonTracksTileset,\n\n None: { tilesetSources: {}, tilesetLayers: [] },\n};\n\nexport const LAYERS_LEGEND_MAPPING: Record = {\n [TilesetName.WindSpeed100m]: {\n title: \"Mean windspeed - 100m height\",\n items: [\n { color: \"#0000ff\", desc: \"Less than 6m/s\" },\n { color: \"#00ff00\", desc: \"6m/s\" },\n { color: \"#ffff00\", desc: \"7m/s\" },\n { color: \"#ffaa2b\", desc: \"8m/s\" },\n { color: \"#ff0000\", desc: \"10m/s\" },\n { color: \"#804040\", desc: \"12m/s\" },\n ],\n },\n [TilesetName.WindSpeed150m]: {\n title: \"Mean windspeed - 150m height\",\n items: [\n { color: \"#0000ff\", desc: \"Less than 6m/s\" },\n { color: \"#00ff00\", desc: \"6m/s\" },\n { color: \"#ffff00\", desc: \"7m/s\" },\n { color: \"#ffaa2b\", desc: \"8m/s\" },\n { color: \"#ff0000\", desc: \"10m/s\" },\n { color: \"#804040\", desc: \"12m/s\" },\n ],\n },\n [TilesetName.PrimaryRoadContour]: {\n title: \"Primary road contours\",\n items: [\n { color: \"#0088ff\", desc: \"More than 10km\" },\n { color: \"#ff9100\", desc: \"More than 20km\" },\n { color: \"#ff61ff\", desc: \"More than 50km\" },\n { color: \"#d7191c\", desc: \"More than 100km\" },\n ],\n },\n [TilesetName.SecondaryRoadContour]: {\n title: \"Secondary road contours\",\n items: [\n { color: \"#0088ff\", desc: \"More than 10km\" },\n { color: \"#ff9100\", desc: \"More than 20km\" },\n { color: \"#ff61ff\", desc: \"More than 50km\" },\n { color: \"#d7191c\", desc: \"More than 100km\" },\n ],\n },\n [TilesetName.TertiaryRoadContour]: {\n title: \"Tertiary road contours\",\n items: [\n { color: \"#0088ff\", desc: \"More than 10km\" },\n { color: \"#ff9100\", desc: \"More than 20km\" },\n { color: \"#ff61ff\", desc: \"More than 50km\" },\n { color: \"#d7191c\", desc: \"More than 100km\" },\n ],\n },\n [TilesetName.PopulationDensity]: {\n title: \"Population density\",\n items: [\n { color: \"#1a9850\", desc: \"Less than 50km\" },\n { color: \"#2166ab\", desc: \"Less than 100km\" },\n { color: \"#fdb863\", desc: \"Less than 150km\" },\n { color: \"#542788\", desc: \"Less than 200km\" },\n { color: \"#d73027\", desc: \"Others\" },\n ],\n },\n [TilesetName.SubstationsProximity]: {\n title: \"Proximity to substations\",\n items: [\n { color: \"#1a9850\", desc: \"Less than 10km\" },\n { color: \"#3288bd\", desc: \"Less than 30km\" },\n { color: \"#f46d43\", desc: \"Less than 50km\" },\n { color: \"#d73027\", desc: \"Others\" },\n ],\n },\n [TilesetName.SeaPorts]: {\n title: \"Sea ports\",\n items: [\n {\n color: \"#ffffff\",\n desc: \"Harbour Size\",\n },\n {\n color: \"#ffffff00\",\n desc: \"- Large [L], Med [M], Small [S], Very Small [V]\",\n },\n { color: \"#ffffff\", desc: \"Max Vessel Size: \" },\n {\n color: \"#ffffff00\",\n desc: \"- >500m [L], <500m [M]\",\n },\n ],\n },\n [TilesetName.Bathymetry]: {\n title: \"Bathymetry\",\n items: [\n { color: \"#fdfecc\", desc: \"0 to -30m\" },\n { color: \"#5dbaa4\", desc: \"-30m to -60m\" },\n { color: \"#3e6495\", desc: \"-60m to -90m\" },\n { color: \"#281a2c\", desc: \"-90m to -500m\" },\n ],\n },\n [TilesetName.TyphoonTracks]: {\n title: \"Saffir-Simpson Category\",\n items: [\n { color: \"#0000ff\", desc: \"Category 1\" },\n { color: \"#00ff00\", desc: \"Category 2\" },\n { color: \"#ff0000\", desc: \"Category 3 and above\" },\n ],\n },\n [TilesetName.LandUse]: {\n title: \"Land Use\",\n items: [\n { color: \"#964B00\", desc: \"Needle Forest\" },\n { color: \"#00FF00\", desc: \"Broad Leaf Forest\" },\n { color: \"#ffbb22\", desc: \"Shrubs\" },\n { color: \"#ffff4c\", desc: \"Herbaceous Vegetation\" },\n { color: \"#0096a0\", desc: \"Herbaceous Wetland\" },\n { color: \"#fae6a0\", desc: \"Moss Lichen\" },\n { color: \"#b4b4b4\", desc: \"Sparse Vegetation\" },\n { color: \"#f096ff\", desc: \"Agriculture\" },\n { color: \"#fa0000\", desc: \"Urban\" },\n { color: \"#f0f0f0\", desc: \"Snow Ice\" },\n { color: \"#0032c8\", desc: \"Water\" },\n ],\n },\n};\n\nexport const AREA_THRESHOLD = 1_000_000_000;\n\nexport const DEFAULT_TURBINE_CAPACITY = 4.2;\nexport const MAX_NUMBER_OF_TURBINES = 125;\n\nexport const DEFAULT_LNG = 115.981587;\nexport const DEFAULT_LAT = 9.657057;\nexport const DEFAULT_ZOOM = 4;\n\ninterface LayerConfig {\n column: string;\n lowFill: string;\n highFill: string;\n lowScore: number;\n highScore: number;\n}\n\nexport const LSP_LAYER_SETTINGS: Record = {\n windSpeed: {\n column: \"WS_SLOPE_SCORE\",\n lowFill: \"#f7fcf5\",\n highFill: \"#04588d\",\n lowScore: 6,\n highScore: 22,\n },\n protectedArea: {\n column: \"protected_areas_score\",\n lowFill: \"#00441b\",\n highFill: \"#f7fcf5\",\n lowScore: -2,\n highScore: 0,\n },\n landUse: {\n column: \"land_use_score\",\n lowFill: \"#08306b\",\n highFill: \"#f7fbff\",\n lowScore: -5,\n highScore: 0,\n },\n elevation: {\n column: \"elevation_score\",\n lowFill: \"#67000d\",\n highFill: \"#f7fbff\",\n lowScore: -10,\n highScore: 0,\n },\n slope: {\n column: \"slope_score\",\n lowFill: \"#fcfbfd\",\n highFill: \"#f7fbff\",\n lowScore: -10,\n highScore: 0,\n },\n total: {\n column: \"total_score\",\n lowFill: \"#fff5eb\",\n highFill: \"#7f2704\",\n lowScore: -1,\n highScore: 9,\n },\n};\n\nexport const LSP_SOURCE_LAYERS = {\n output_contours_id_0: \"ID 0\",\n};\n","import { polygon } from \"@turf/helpers\";\nimport mapboxgl from \"mapbox-gl\";\nimport { fromLatLon, toLatLon } from \"utm\";\nimport { EllipseConfig, GeneratedLayoutResultPoint, Point } from \"./types\";\n\nconst getEllipsePoint = (\n theta: number,\n majorRadius: number,\n minorRadius: number,\n ellipseAngle: number,\n basePointX: number,\n basePointY: number\n): [number, number] => {\n const r =\n (majorRadius * minorRadius) /\n Math.hypot(minorRadius * Math.cos(theta), majorRadius * Math.sin(theta));\n const headingTheta = Math.PI / 2 - theta - (ellipseAngle * Math.PI) / 180;\n return [\n basePointX + r * Math.cos(headingTheta),\n basePointY + r * Math.sin(headingTheta),\n ];\n};\n\nexport const getEllipse = (\n centerLngLat: [number, number],\n baseDiameter: number,\n majorAxis: number,\n minorAxis: number,\n rotation: number,\n numPoints = 100\n): [number, number][] => {\n const { easting, northing, zoneNum, zoneLetter } = fromLatLon(\n centerLngLat[1],\n centerLngLat[0]\n );\n\n return [...Array(numPoints).keys()].map((i) => {\n const { latitude, longitude } = toLatLon(\n ...getEllipsePoint(\n (2 * Math.PI * i) / numPoints,\n (baseDiameter * majorAxis) / 2,\n (baseDiameter * minorAxis) / 2,\n rotation,\n easting,\n northing\n ),\n zoneNum,\n zoneLetter\n );\n return [longitude, latitude];\n });\n};\n\nexport const getTurbineSvg = (): HTMLElement => {\n const turbineTemplate = document.createElement(\"template\");\n turbineTemplate.innerHTML =\n '';\n const turbineSvg = turbineTemplate.content.firstChild as HTMLElement;\n turbineSvg.style.maxWidth = \"40px\";\n return turbineSvg;\n};\n\nexport const addTurbinesToMap = (\n map: mapboxgl.Map,\n points: (GeneratedLayoutResultPoint | Point)[],\n ellipseConfig?: EllipseConfig,\n showPopup = false\n): mapboxgl.Marker[] => {\n const markers = [];\n\n for (const [idx, point] of points.entries()) {\n const marker = new mapboxgl.Marker({\n element: getTurbineSvg(),\n anchor: \"bottom\",\n offset: [-5, 8],\n }).setLngLat([point.x, point.y]);\n\n let popupText = `(${idx + 1})`;\n if (\"ws\" in point) {\n popupText += `Wind speed: ${point.ws.toFixed(2)} m/s`;\n }\n\n marker.setPopup(new mapboxgl.Popup().setText(popupText));\n\n marker.addTo(map);\n\n if (showPopup) {\n marker.togglePopup();\n }\n\n markers.push(marker);\n\n if (ellipseConfig !== undefined) {\n const ellipseSourceId = ellipseConfig.ellipseSourceIdNaming(idx);\n\n const ellipse = getEllipse(\n [point.x, point.y],\n ellipseConfig.ellipseBaseDiameter,\n ellipseConfig.ellipseMajor,\n ellipseConfig.ellipseMinor,\n ellipseConfig.ellipseRotation\n );\n\n map.addSource(ellipseSourceId, {\n type: \"geojson\",\n data: polygon([ellipse.concat([ellipse[0]])]),\n });\n map.addLayer({\n id: ellipseSourceId,\n type: \"line\",\n source: ellipseSourceId,\n layout: {},\n paint: {\n \"line-color\": \"#fff\",\n \"line-width\": 3,\n },\n });\n }\n }\n\n return markers;\n};\n","import styled from \"styled-components\";\n\ntype ContainerProps = {\n fontSize?: string;\n fontWeight?: string;\n minWidth?: string;\n};\n\nconst Container = styled.div`\n background-color: rgba(35, 55, 75, 0.9);\n color: #ffffff;\n padding: 8px 12px;\n border-radius: 3px;\n width: fit-content;\n height: fit-content;\n font-size: ${({ fontSize }) => fontSize ?? \"inherit\"};\n font-weight: ${({ fontWeight }) => fontWeight ?? \"inherit\"};\n min-width: ${({ minWidth }) => minWidth ?? \"inherit\"};\n`;\n\nexport default Container;\n","// https://github.com/mapbox/mapbox-gl-draw/blob/main/docs/API.md#styling-draw\n\nconst pointRadius = 3;\nconst pointColor = \"#ffffff\";\nconst lineColor = \"#ffffff\";\nconst lineWidth = 3;\nconst lineDashStyle = [0.2, 2];\nconst polygonFillColor = \"#000000\";\nconst polygonFillOpacity = 0;\n\nexport const PointDrawStyle = [\n {\n id: \"highlight-active-points\",\n type: \"circle\",\n filter: [\n \"all\",\n [\"==\", \"$type\", \"Point\"],\n [\"==\", \"meta\", \"feature\"],\n [\"==\", \"active\", \"true\"],\n ],\n paint: {\n \"circle-radius\": pointRadius,\n \"circle-color\": pointColor,\n },\n },\n {\n id: \"points-are-blue\",\n type: \"circle\",\n filter: [\n \"all\",\n [\"==\", \"$type\", \"Point\"],\n [\"==\", \"meta\", \"feature\"],\n [\"==\", \"active\", \"false\"],\n ],\n paint: {\n \"circle-radius\": pointRadius,\n \"circle-color\": pointColor,\n },\n },\n];\n\nexport const LineDrawStyle = [\n // ACTIVE (being drawn)\n // line stroke\n {\n id: \"gl-draw-line\",\n type: \"line\",\n filter: [\"all\", [\"==\", \"$type\", \"LineString\"], [\"!=\", \"mode\", \"static\"]],\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": lineColor,\n \"line-dasharray\": lineDashStyle,\n \"line-width\": lineWidth,\n },\n },\n\n // INACTIVE (static, already drawn)\n // line stroke\n {\n id: \"gl-draw-line-static\",\n type: \"line\",\n filter: [\"all\", [\"==\", \"$type\", \"LineString\"], [\"==\", \"mode\", \"static\"]],\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": lineColor,\n \"line-width\": lineWidth,\n },\n },\n];\n\nexport const PolygonDrawStyle = [\n // ACTIVE (being drawn)\n // polygon fill\n {\n id: \"gl-draw-polygon-fill\",\n type: \"fill\",\n filter: [\"all\", [\"==\", \"$type\", \"Polygon\"], [\"!=\", \"mode\", \"static\"]],\n paint: {\n \"fill-color\": polygonFillColor,\n \"fill-opacity\": polygonFillOpacity,\n },\n },\n // polygon mid points\n {\n id: \"gl-draw-polygon-midpoint\",\n type: \"circle\",\n filter: [\"all\", [\"==\", \"$type\", \"Point\"], [\"==\", \"meta\", \"midpoint\"]],\n paint: {\n \"circle-radius\": pointRadius,\n \"circle-color\": pointColor,\n },\n },\n // polygon outline stroke\n // This doesn't style the first edge of the polygon, which uses the line stroke styling instead\n {\n id: \"gl-draw-polygon-stroke-active\",\n type: \"line\",\n filter: [\"all\", [\"==\", \"$type\", \"Polygon\"], [\"!=\", \"mode\", \"static\"]],\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": lineColor,\n \"line-dasharray\": lineDashStyle,\n \"line-width\": lineWidth,\n },\n },\n // vertex point halos\n {\n id: \"gl-draw-polygon-and-line-vertex-halo-active\",\n type: \"circle\",\n filter: [\n \"all\",\n [\"==\", \"meta\", \"vertex\"],\n [\"==\", \"$type\", \"Point\"],\n [\"!=\", \"mode\", \"static\"],\n ],\n paint: {\n \"circle-radius\": pointRadius,\n \"circle-color\": pointColor,\n },\n },\n // vertex points\n {\n id: \"gl-draw-polygon-and-line-vertex-active\",\n type: \"circle\",\n filter: [\n \"all\",\n [\"==\", \"meta\", \"vertex\"],\n [\"==\", \"$type\", \"Point\"],\n [\"!=\", \"mode\", \"static\"],\n ],\n paint: {\n \"circle-radius\": pointRadius,\n \"circle-color\": pointColor,\n },\n },\n\n // INACTIVE (static, already drawn)\n // polygon fill\n {\n id: \"gl-draw-polygon-fill-static\",\n type: \"fill\",\n filter: [\"all\", [\"==\", \"$type\", \"Polygon\"], [\"==\", \"mode\", \"static\"]],\n paint: {\n \"fill-color\": polygonFillColor,\n \"fill-opacity\": polygonFillOpacity,\n },\n },\n // polygon outline\n {\n id: \"gl-draw-polygon-stroke-static\",\n type: \"line\",\n filter: [\"all\", [\"==\", \"$type\", \"Polygon\"], [\"==\", \"mode\", \"static\"]],\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": lineColor,\n \"line-width\": lineWidth,\n },\n },\n];\n","import { InfoCircleOutlined } from \"@ant-design/icons/lib\";\nimport { Tooltip } from \"antd\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\nimport { TilesetCategory, UiType } from \"../types\";\nimport Container from \"./Container\";\n\nconst SectionTitle = styled.div`\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 6px;\n`;\n\nconst OptionLabel = styled.label`\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n`;\n\nconst OptionValue = styled.span`\n margin-left: 6px;\n margin-right: 6px;\n`;\n\nconst TooltipElement = styled.div`\n display: inline-block;\n margin-left: 2px;\n`;\n\nexport interface LayerOption {\n name: string;\n layerName: string;\n tilesetCategory: TilesetCategory;\n uiType: UiType;\n uiGroupName: string;\n tooltip?: string;\n}\n\nconst LayersControl: React.FC<{\n loading: boolean;\n rasterOptions: LayerOption[];\n vectorOptions: LayerOption[];\n initialRasterOptions: LayerOption[];\n selectedVectorOptions: LayerOption[];\n onSelectRaster: (\n selectedOption: LayerOption,\n unselectedOption?: LayerOption\n ) => void;\n onToggleVector: (option: LayerOption, isCheck: any) => void;\n}> = ({\n loading,\n rasterOptions,\n vectorOptions,\n initialRasterOptions,\n selectedVectorOptions,\n onSelectRaster,\n onToggleVector,\n}) => {\n const [selectedRasterOptions, setSelectedRasterOptions] = useState<\n Record\n >(\n Object.fromEntries(\n initialRasterOptions.map((opt) => [opt.uiGroupName, opt])\n )\n );\n const selectedVectorOptionNames = selectedVectorOptions.map(\n (opt) => opt.layerName\n );\n\n const onToggleRasterRadioGroup = (option: LayerOption) => {\n const prevLayerOption = selectedRasterOptions[option.uiGroupName];\n onSelectRaster(option, prevLayerOption);\n setSelectedRasterOptions({\n ...selectedRasterOptions,\n [option.uiGroupName]: option,\n });\n };\n\n const renderTooltip = (option: LayerOption) => {\n return (\n \n \n \n \n \n );\n };\n\n const renderRasterOption = (option: LayerOption, i: number) => (\n
\n \n onToggleRasterRadioGroup(option)}\n disabled={loading}\n checked={\n option.uiGroupName in selectedRasterOptions &&\n option.layerName ===\n selectedRasterOptions[option.uiGroupName].layerName\n }\n name={option.uiGroupName}\n type={option.uiType}\n />\n {option.name}\n {option.tooltip && renderTooltip(option)}\n \n
\n );\n const renderVectorOption = (option: LayerOption, i: number) => (\n
\n \n onToggleVector(option, event.target.checked)}\n disabled={loading}\n checked={selectedVectorOptionNames.includes(option.layerName)}\n name={option.uiGroupName}\n type={option.uiType}\n />\n {option.name}\n {option.tooltip && renderTooltip(option)}\n \n
\n );\n\n const sectionTitleTilesetCategoryPairs = [\n [\"Base Layer\", TilesetCategory.BaseLayer],\n [\"Roads\", TilesetCategory.Roads],\n [\"Social & Environmental\", TilesetCategory.EnviroSocial],\n [\"Resource\", TilesetCategory.Resource],\n [\"Other Technical\", TilesetCategory.Technical],\n ];\n\n return (\n \n {sectionTitleTilesetCategoryPairs.map(\n ([sectionTitle, tilesetCategory], idx) => (\n \n {sectionTitle}\n {rasterOptions &&\n rasterOptions.length > 0 &&\n rasterOptions\n .filter((option) => option.tilesetCategory === tilesetCategory)\n .map(renderRasterOption)}\n {vectorOptions &&\n vectorOptions.length > 0 &&\n vectorOptions\n .filter((option) => option.tilesetCategory === tilesetCategory)\n .map(renderVectorOption)}\n {idx + 1 !== sectionTitleTilesetCategoryPairs.length &&
}\n
\n )\n )}\n
\n );\n};\n\nexport default LayersControl;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst LayersLegendFloatingContainer = styled.div`\n z-index: 1;\n position: absolute;\n bottom: 0;\n right: 0;\n padding: 24px 12px;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n max-height: calc(100vh - 40px);\n overflow: auto;\n`;\n\nconst LayerLegend = styled.div`\n position: relative;\n float: right;\n width: fit-content;\n margin-top: 20px;\n background-color: rgba(35, 55, 75, 0.9);\n color: #ffffff;\n padding: 12px 12px;\n border-radius: 3px;\n`;\n\nconst LayerLegendTitle = styled.div`\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 4px;\n`;\n\nconst LayerLegendItemContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst LayerLegendItemColorIndicator = styled.div`\n height: 20px;\n width: 20px;\n border: white solid 1px;\n margin: 4px;\n`;\n\ninterface LayerLegendItemConfig {\n color: string;\n desc: string;\n}\n\nexport interface LayerLegendConfig {\n title: string;\n items: LayerLegendItemConfig[];\n}\n\ninterface LayersLegendConfigProps {\n configs: LayerLegendConfig[];\n}\n\nconst LayersLegend: React.FC = ({ configs }) => {\n return (\n \n {configs.map((config) => (\n \n {config.title}\n {config.items.map((entry) => (\n \n \n  \n \n {entry.desc}\n \n ))}\n \n ))}\n \n );\n};\n\nexport default LayersLegend;\n","import styled from \"styled-components\";\n\nconst DataGroup = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: 8px;\n\n & > * {\n flex: 1;\n }\n`;\n\nexport default DataGroup;\n","import styled from \"styled-components\";\n\nconst SectionTitle = styled.div`\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 4px;\n`;\n\nexport default SectionTitle;\n","import { Button } from \"antd\";\nimport styled from \"styled-components\";\n\nconst StyledButton = styled(Button)`\n margin: 8px 0;\n font-weight: 500;\n height: 28px;\n width: 100%;\n align-self: center;\n`;\n\nexport default StyledButton;\n","import { Input } from \"antd\";\nimport styled from \"styled-components\";\n\nconst StyledInput = styled(Input)`\n height: 24px;\n font-size: 14px;\n padding: 0 6px;\n font-weight: 500;\n`;\n\nexport default StyledInput;\n","import area from \"@turf/area\";\n// eslint-disable-next-line import/no-unresolved\nimport { Feature } from \"geojson\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport {\n AREA_THRESHOLD,\n DEFAULT_TURBINE_CAPACITY,\n MAX_NUMBER_OF_TURBINES,\n} from \"../constants\";\nimport { ApiState, SlgApiData, SlgForm } from \"../types\";\nimport Container from \"./Container\";\nimport DataGroup from \"./DataGroup\";\nimport SectionTitle from \"./SectionTitle\";\nimport StyledButton from \"./StyledButton\";\nimport StyledInput from \"./StyledInput\";\n\nconst OptionLabel = styled.label`\n display: flex;\n align-items: center;\n margin: 6px 0 12px 0;\n`;\n\nconst OptionValue = styled.span`\n padding-left: 4px;\n`;\n\nconst SeedLayoutGeneratorForm = styled.div`\n display: flex;\n flex-direction: column;\n width: 375px;\n`;\n\nconst ProjectBoundaryDescription = styled.div`\n line-height: 1.4;\n border-radius: 3px;\n background-color: #23374b;\n padding: 8px;\n margin: 8px 0 18px;\n`;\n\nconst LayoutGeneratorControl: React.FC<{\n loading: boolean;\n onStartAction: () => void;\n onResetAction: () => void;\n onRunAction: () => void;\n onSendEmailAction: () => void;\n drawMode: boolean;\n slgForm: SlgForm;\n setSlgForm: (slgForm: SlgForm) => void;\n slgApiState: ApiState;\n sendEmailApiState: ApiState;\n polygonDrawn: Feature | undefined;\n apiData: SlgApiData | undefined;\n useAdvancedHeuristics: boolean;\n}> = ({\n loading,\n onStartAction,\n onResetAction,\n onRunAction,\n onSendEmailAction,\n drawMode,\n slgForm,\n setSlgForm,\n slgApiState,\n sendEmailApiState,\n polygonDrawn,\n apiData,\n useAdvancedHeuristics,\n}) => {\n const [showEmailBox, setShowEmailBox] = useState(false);\n\n let slgButton;\n switch (slgApiState) {\n case ApiState.READY:\n case ApiState.ERROR:\n slgButton = `Generate${\n useAdvancedHeuristics ? \" (with advanced heuristics)\" : \"\"\n }`;\n break;\n case ApiState.FINISHED:\n slgButton = `Rerun${\n useAdvancedHeuristics ? \" (with advanced heuristics)\" : \"\"\n }`;\n break;\n case ApiState.LOADING:\n slgButton = \"Generating... This may take a while\";\n break;\n default:\n throw new Error(`Do not know what text to show with ${slgApiState}`);\n }\n\n const canRunSlg = slgApiState !== ApiState.LOADING;\n\n let sendEmailButton;\n switch (sendEmailApiState) {\n case ApiState.READY:\n case ApiState.ERROR:\n sendEmailButton = \"Send email\";\n break;\n case ApiState.FINISHED:\n sendEmailButton = \"Sent!\";\n break;\n case ApiState.LOADING:\n sendEmailButton = \"Sending...\";\n break;\n default:\n throw new Error(`Do not know what text to show with ${slgApiState}`);\n }\n\n const polygonArea = polygonDrawn && area(polygonDrawn);\n\n const maxTurbineCapacityAllowed =\n (slgForm.setAdvancedSettings\n ? Number(slgForm.mw)\n : DEFAULT_TURBINE_CAPACITY) * MAX_NUMBER_OF_TURBINES;\n\n return (\n \n Layout Generator\n {drawMode ? (\n \n \n {polygonDrawn === undefined\n ? \"Draw a project boundary by clicking on the map.\"\n : null}\n {polygonArea !== undefined && [\n !useAdvancedHeuristics && polygonArea > AREA_THRESHOLD\n ? `Drawn boundary is too large: ${(polygonArea / 1e6).toFixed(\n 1\n )} km². Max ${\n AREA_THRESHOLD / 1e6\n } km². Adjust by first clicking the drawn polygon once, then dragging its vertices.`\n : `Project boundary area: ${(polygonArea / 1e6).toFixed(\n 1\n )} km².`,\n ]}\n {slgApiState === ApiState.ERROR ? (\n <>\n
\n Error: change some parameters and try again.\n \n ) : null}\n {sendEmailApiState === ApiState.ERROR ? (\n <>\n
\n Error sending email. Please try again.\n \n ) : null}\n
\n \n \n \n setSlgForm({ ...slgForm, windFarmName: value })\n }\n type=\"text\"\n name=\"form-wind-farm-name\"\n id=\"form-wind-farm-name\"\n disabled={!canRunSlg}\n />\n \n \n \n \n setSlgForm({ ...slgForm, maxCapacity: value })\n }\n type=\"number\"\n name=\"form-max-capacity\"\n id=\"form-max-capacity\"\n disabled={!canRunSlg}\n />\n \n {useAdvancedHeuristics &&\n [\n [\"superfuncA\", \"Superfunc A\"],\n [\"superfuncB\", \"Superfunc B\"],\n [\"superfuncC\", \"Superfunc C\"],\n [\"superfuncMultiplier\", \"Superfunc multiplier\"],\n [\"slopefuncDropSteepness\", \"Slopefunc drop steepness\"],\n [\"slopefuncHalfPoint\", \"Slopefunc half point\"],\n [\"proximityMultiplier\", \"Proximity multiplier\"],\n [\"proximityPower\", \"Proximity power\"],\n [\n \"wakeMaxDownwindDistancePerDiameter\",\n \"Wake max downwind distance per diameter\",\n ],\n [\"wakeK\", \"Wake K\"],\n [\"wakeCt\", \"Wake Ct\"],\n [\"elevationAreaFactor\", \"Elevation area factor\"],\n [\"elevationPowerFactor\", \"Elevation power factor\"],\n [\"elevationOverallFactor\", \"Elevation overall factor\"],\n ].map(([key, label]) => (\n \n \n \n setSlgForm({ ...slgForm, [key]: value })\n }\n name={`advanced-${key}`}\n id={`advanced-${key}`}\n disabled={!canRunSlg}\n />\n \n ))}\n \n \n setSlgForm({\n ...slgForm,\n setAdvancedSettings: event.target.checked,\n })\n }\n checked={slgForm.setAdvancedSettings}\n name=\"set-advanced-settings\"\n type=\"checkbox\"\n disabled={!canRunSlg}\n />\n Set advanced settings\n \n {slgForm.setAdvancedSettings &&\n [\n [\"mw\", \"Turbine size [MW]\"],\n [\"diameter\", \"Rotor diameter [m]\"],\n [\"ellipseMajor\", \"Major spacing [xRD]\"],\n [\"ellipseMinor\", \"Minor spacing [xRD]\"],\n [\"ellipseRotation\", \"Wind direction [deg]\"],\n ].map(([key, label]) => (\n \n \n \n setSlgForm({ ...slgForm, [key]: value })\n }\n type=\"number\"\n name={`advanced-${key}`}\n id={`advanced-${key}`}\n disabled={!canRunSlg}\n />\n \n ))}\n {!useAdvancedHeuristics &&\n Number(slgForm.maxCapacity) > maxTurbineCapacityAllowed &&\n (!slgForm.setAdvancedSettings || slgForm.mw !== \"\") &&\n `The max capacity of your layout is too big. It should be at most ${maxTurbineCapacityAllowed} MW.`}\n maxTurbineCapacityAllowed ||\n polygonArea > AREA_THRESHOLD)) ||\n [\n \"windFarmName\",\n \"maxCapacity\",\n // @ts-ignore typescript not supported\n ].some((k) => slgForm[k] === \"\") ||\n (slgForm.setAdvancedSettings &&\n [\n \"mw\",\n \"diameter\",\n \"ellipseMajor\",\n \"ellipseMinor\",\n \"ellipseRotation\",\n // @ts-ignore typescript not supported\n ].some((k) => slgForm[k] === \"\"))\n }\n onClick={onRunAction}\n >\n {slgButton}\n \n {apiData &&\n [\n [\"Wind farm name\", apiData.sentData.windFarmName],\n [\"Turbine name\", apiData.turbineName],\n [\"Number of turbines\", apiData.result.length],\n [\n \"Total capacity\",\n `${(apiData.result.length * apiData.turbineCapacity).toFixed(\n 1\n )} MW`,\n ],\n [\"Mean wind speed\", `${apiData.averageWindSpeed.toFixed(2)} m/s`],\n [\n \"Predominant wind direction (North=0, CW)\",\n `${apiData.ellipseRotation.toFixed(0)} degrees`,\n ],\n [\n \"GROSS capacity factor\",\n `${(apiData.capacityFactor * 100).toFixed(2)}%`,\n ],\n [\"Constructability\", \"coming soon!\"],\n [\"Reachability\", \"coming soon!\"],\n [\"LCOE range\", \"coming soon!\"],\n [\"IRR range\", \"coming soon!\"],\n ].map(([key, value]) => (\n \n
{key}
\n
{value}
\n
\n ))}\n {apiData?.message !== \"\" ? apiData?.message : null}\n {slgApiState === ApiState.FINISHED && (\n setShowEmailBox(true)}\n disabled={showEmailBox}\n >\n Get KML\n \n )}\n {showEmailBox && (\n <>\n
\n Please fill in your email. We will send you the KML file.\n
\n \n \n \n setSlgForm({ ...slgForm, email: value })\n }\n type=\"email\"\n name=\"form-email\"\n id=\"form-email\"\n />\n \n \n {sendEmailButton}\n \n \n )}\n {\n setShowEmailBox(false);\n onResetAction();\n }}\n disabled={slgApiState === ApiState.LOADING}\n >\n Reset\n \n
\n ) : (\n \n Draw Boundary\n \n )}\n
\n );\n};\n\nexport default LayoutGeneratorControl;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst LocationIndicatorContainer = styled.div`\n background-color: rgba(35, 55, 75, 0.9);\n color: #ffffff;\n padding: 6px 12px;\n z-index: 1;\n position: absolute;\n bottom: 24px;\n left: 0;\n margin: 12px;\n border-radius: 3px;\n`;\n\nconst LocationIndicator: React.FC<{\n lng: number;\n lat: number;\n zoom: number;\n}> = ({ lng, lat, zoom }) => {\n return (\n \n Longitude: {lng.toFixed(6)} | Latitude: {lat.toFixed(6)} | Zoom:{\" \"}\n {zoom.toFixed(1)}\n \n );\n};\n\nexport default LocationIndicator;\n","import { InfoCircleOutlined } from \"@ant-design/icons/lib\";\nimport { Tooltip } from \"antd\";\nimport { saveAs } from \"file-saver\";\nimport mapboxgl from \"mapbox-gl\";\nimport React, { useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { LspResult } from \"../types\";\nimport Container from \"./Container\";\nimport SectionTitle from \"./SectionTitle\";\nimport StyledButton from \"./StyledButton\";\nimport StyledInput from \"./StyledInput\";\n\ninterface Props {\n lspPolygonId?: number;\n lspSelectedData?: LspResult;\n setLspPolygonId: (newId: number | undefined) => void;\n mapBoxMap: mapboxgl.Map | null;\n}\n\nconst PolygonIdStyledInput = styled(StyledInput)`\n width: 100px;\n`;\n\n/* eslint-disable */\n// https://stackoverflow.com/a/47593316, modified Mulberry32\nconst getRandomNumber = (\n seed: number,\n lowerBound: number,\n upperBound: number\n): number => {\n let t = (seed += 0x6d2b79f5);\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n const res = ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n return lowerBound + res * (upperBound - lowerBound);\n};\n/* eslint-enable */\n\nconst LspInfoLine = styled.div<{ strong?: boolean; gutterBottom?: boolean }>`\n display: flex;\n gap: 4px;\n font-weight: ${({ strong }) => (strong ? \"bold\" : \"inherit\")};\n margin-bottom: ${({ gutterBottom }) => (gutterBottom ? \"8px\" : \"0px\")};\n`;\n\nconst LspInfoKey = styled.div`\n flex: 1;\n`;\n\nconst PROTECTED_AREA_TOOLTIP: Record = {\n \"-2.0\": \"Polygon intersects protected area by 0.5% to 5%\",\n};\n\nconst LAND_USE_TOOLTIP: Record = {\n \"-5.0\":\n \"Polygon intersects agriculture areas by > 75%, and urban areas by 0.5% to 10%\",\n \"-4.0\":\n \"Polygon intersects agriculture areas by 50% to 75%, and urban areas by 0.5% to 10%\",\n \"-3.0\":\n \"Polygon intersects agriculture areas by > 75%; or polygon intersects agriculture areas by 25% to 50%, and urban areas by 0.5% to 10%\",\n \"-2.0\":\n \"Polygon intersects agriculture areas by 50% to 75%; or polygon intersects urban areas by 0.5% to 10%\",\n \"-1.0\": \"Polygon intersects agriculture areas by 25% to 50%\",\n};\n\nconst ELEVATION_TOOLTIP: Record = {\n \"-10.0\": \"Elevation value + hub height is between 2000 and 3000 meters\",\n \"-5.0\": \"Elevation value + hub height is between 1000 and 2000 meters\",\n};\n\nconst SLOPE_TOOLTIP: Record = {\n \"-10.0\": \"Polygon intersects area with slope > 17 degrees by > 50%\",\n \"-8.0\": \"Polygon intersects area with slope > 17 degrees by 40% to 50%\",\n \"-6.0\": \"Polygon intersects area with slope > 17 degrees by 30% to 40%\",\n \"-4.0\": \"Polygon intersects area with slope > 17 degrees by 20% to 30%\",\n \"-2.0\": \"Polygon intersects area with slope > 17 degrees by 10% to 20%\",\n};\n\nconst LspInfoTooltip: React.FC<{ text?: string }> = ({ text }) =>\n text === undefined ? null : (\n \n \n \n );\n\nconst LspInfo: React.FC = ({\n lspPolygonId,\n setLspPolygonId,\n lspSelectedData,\n mapBoxMap,\n}) => {\n useEffect(() => {\n if (lspSelectedData === undefined || mapBoxMap === null) {\n return;\n }\n\n mapBoxMap\n .setCenter(\n lspSelectedData.polygon\n .reduce((acc, curr) => [acc[0] + curr[0], acc[1] + curr[1]])\n .map((c) => c / lspSelectedData.polygon.length) as [number, number]\n )\n .setZoom(11);\n }, [lspSelectedData, mapBoxMap]);\n\n const kml =\n lspSelectedData !== undefined &&\n `\n \n \n ${lspPolygonId}\n \n Polygon\n \n \n \n \n ${lspSelectedData.polygon\n .map(([lon, lat]) => `${lon},${lat}`)\n .join(\" \")}\n \n \n \n \n \n \n Turbines\n ${lspSelectedData.points\n .map(\n ([lon, lat], idx) => `\n \n Turbine ${idx}\n \n ${lon},${lat}\n \n \n `\n )\n .join(\"\")}\n \n \n \n`;\n\n return (\n \n Large Scale Prospecting Polygon Information\n \n Polygon ID\n \n setLspPolygonId(value === \"\" ? undefined : Number(value))\n }\n type=\"text\"\n />\n \n {lspPolygonId !== undefined && (\n <>\n \n Wind speed and slope score\n
{lspSelectedData?.ws_slope_score ?? \"Loading...\"}
\n \n
\n \n Protected areas score\n
{lspSelectedData?.protected_areas_score ?? \"Loading...\"}
\n {lspSelectedData !== undefined && (\n \n )}\n
\n \n Land use score\n
{lspSelectedData?.land_use_score ?? \"Loading...\"}
\n {lspSelectedData !== undefined && (\n \n )}\n
\n \n Elevation score\n
{lspSelectedData?.elevation_score ?? \"Loading...\"}
\n {lspSelectedData !== undefined && (\n \n )}\n
\n \n Slope score\n
{lspSelectedData?.slope_score ?? \"Loading...\"}
\n {lspSelectedData !== undefined && (\n \n )}\n
\n \n Total score\n
{lspSelectedData?.total_score ?? \"Loading...\"}
\n
\n \n Mean wind speed\n
\n {lspSelectedData === undefined\n ? \"Loading...\"\n : `${lspSelectedData.mws.toFixed(2)} m/s`}\n
\n
\n \n Capacity factor\n
\n {lspPolygonId === undefined\n ? \"Loading...\"\n : `${getRandomNumber(lspPolygonId, 15, 30).toFixed(1)}%`}\n
\n
\n \n CAPEX\n
\n {lspPolygonId === undefined\n ? \"Loading...\"\n : `${(\n Math.trunc(getRandomNumber(lspPolygonId, 8000, 15000)) * 100\n ).toFixed(0)} $/MW`}\n
\n
\n \n IRR\n
\n {lspPolygonId === undefined\n ? \"Loading...\"\n : `${getRandomNumber(lspPolygonId, 5, 12).toFixed(1)}%`}\n
\n
\n \n kml &&\n saveAs(\n new Blob([kml], {\n type: \"application/vnd.google-earth.kml+xml\",\n }),\n \"result.kml\"\n )\n }\n disabled={!kml}\n >\n Download KML\n \n \n )}\n
\n );\n};\n\nexport default LspInfo;\n","import { InfoCircleOutlined } from \"@ant-design/icons/lib\";\nimport { Tooltip } from \"antd\";\nimport mapboxgl from \"mapbox-gl\";\nimport React, { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { LSP_LAYER_SETTINGS, LSP_SOURCE_LAYERS } from \"../constants\";\nimport Container from \"./Container\";\nimport SectionTitle from \"./SectionTitle\";\n\ninterface Props {\n loading: boolean;\n mapBoxMap: mapboxgl.Map | null;\n}\n\nconst OptionGroup = styled.div`\n margin-bottom: 4px;\n`;\n\nconst Subtitle = styled.h4`\n color: white;\n`;\n\nconst LspResultShow: React.FC = ({ mapBoxMap, loading }) => {\n const [typeSelected, setTypeSelected] = useState(\"total\");\n const [layerIds, setLayerIds] = useState([\"output_contours_id_0\"]);\n const [lspLoading, setLspLoading] = useState(false);\n\n const setNotLoading = () => setLspLoading(false);\n\n useEffect(() => {\n if (mapBoxMap === null || loading) {\n return;\n }\n\n setLspLoading(true);\n mapBoxMap.on(\"idle\", setNotLoading);\n\n if (mapBoxMap.getSource(\"lspFill\") === undefined) {\n mapBoxMap.addSource(\"lspFill\", {\n type: \"vector\",\n tiles: [\n \"https://tegola.traverse.ai/maps/lsp_results/{z}/{x}/{y}.vector.pbf\",\n ],\n });\n }\n\n for (const sourceLayer of Object.keys(LSP_SOURCE_LAYERS)) {\n if (mapBoxMap.getLayer(`lspFill-${sourceLayer}`) !== undefined) {\n mapBoxMap.removeLayer(`lspFill-${sourceLayer}`);\n }\n if (mapBoxMap.getLayer(`lspFill-contour-${sourceLayer}`) !== undefined) {\n mapBoxMap.removeLayer(`lspFill-contour-${sourceLayer}`);\n }\n }\n\n if (typeSelected !== undefined) {\n const { column, lowFill, highFill, lowScore, highScore } =\n LSP_LAYER_SETTINGS[typeSelected];\n for (const sourceLayer of layerIds) {\n if (mapBoxMap.getLayer(`lspFill-${sourceLayer}`) === undefined) {\n mapBoxMap.addLayer({\n id: `lspFill-${sourceLayer}`,\n type: \"fill\",\n source: \"lspFill\",\n \"source-layer\": sourceLayer,\n paint: {\n \"fill-color\": [\n \"interpolate\",\n [\"linear\"],\n [\"to-number\", [\"get\", column]],\n lowScore,\n [\"to-color\", lowFill],\n highScore,\n [\"to-color\", highFill],\n ],\n },\n });\n }\n if (\n mapBoxMap.getLayer(`lspFill-contour-${sourceLayer}`) === undefined\n ) {\n mapBoxMap.addLayer({\n id: `lspFill-contour-${sourceLayer}`,\n type: \"line\",\n source: \"lspFill\",\n \"source-layer\": sourceLayer,\n paint: {\n \"line-color\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"selected\"], false],\n \"#f00\",\n \"#000\",\n ],\n \"line-width\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"selected\"], false],\n 3,\n 1,\n ],\n },\n });\n }\n }\n }\n // eslint-disable-next-line consistent-return\n return () => {\n mapBoxMap.off(\"idle\", setNotLoading);\n };\n }, [typeSelected, mapBoxMap, layerIds, loading]);\n\n return (\n \n Show LSP results\n Fill color\n {[\n [\"windSpeed\", \"Wind speed\"],\n [\"protectedArea\", \"Protected area intersection\"],\n [\"landUse\", \"Land use intersection\"],\n [\"elevation\", \"Elevation\"],\n [\"slope\", \"Slope\"],\n [\"total\", \"Total\"],\n ].map(([key, desc]) => (\n \n setTypeSelected(key)}\n disabled={loading || lspLoading}\n />{\" \"}\n {desc}\n \n ))}\n \n Layer IDs\n \n \n \n \n {Object.entries(LSP_SOURCE_LAYERS).map(([key, desc]) => (\n \n \n setLayerIds((ids) =>\n checked ? ids.concat(key) : ids.filter((id) => id !== key)\n )\n }\n disabled={loading || lspLoading}\n />{\" \"}\n {desc}\n \n ))}\n \n );\n};\n\nexport default LspResultShow;\n","import mapboxgl from \"mapbox-gl\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { getLspResults } from \"../api\";\nimport { LspResult } from \"../types\";\nimport { addTurbinesToMap } from \"../utils\";\nimport Container from \"./Container\";\nimport DataGroup from \"./DataGroup\";\nimport SectionTitle from \"./SectionTitle\";\nimport StyledButton from \"./StyledButton\";\nimport StyledInput from \"./StyledInput\";\n\ninterface Props {\n mapBoxMap: mapboxgl.Map | null;\n}\n\nconst LIMIT = 100;\n\nconst LspResultViewer: React.FC = ({ mapBoxMap }) => {\n const [shownIndex, setShownIndex] = useState(undefined);\n const [lspResults, setLspResults] = useState(\n undefined\n );\n const markerPointsRef = useRef([]);\n\n const res =\n shownIndex === undefined || lspResults === undefined\n ? undefined\n : lspResults[shownIndex];\n\n useEffect(() => {\n (async () => {\n if (\n shownIndex === undefined ||\n lspResults === undefined ||\n lspResults[shownIndex] !== undefined\n ) {\n return;\n }\n\n const nextLspResults = await getLspResults({\n limit: LIMIT.toString(),\n offset: shownIndex.toString(),\n });\n if (nextLspResults.length === 0) {\n return;\n }\n\n setLspResults((originalLspResults) => {\n if (originalLspResults !== undefined) {\n for (let i = 0; i < LIMIT; i += 1) {\n // eslint-disable-next-line no-param-reassign\n originalLspResults[shownIndex + i] = nextLspResults[i];\n }\n }\n return originalLspResults;\n });\n })();\n }, [lspResults, shownIndex]);\n\n useEffect(() => {\n if (mapBoxMap === null) {\n return;\n }\n\n if (mapBoxMap.getLayer(\"lsp-result\") !== undefined) {\n mapBoxMap.removeLayer(\"lsp-result\");\n }\n\n for (const marker of markerPointsRef.current) {\n marker.remove();\n }\n markerPointsRef.current = [];\n\n if (shownIndex === undefined || res === undefined) {\n return;\n }\n\n const source = `lsp-result-${shownIndex}`;\n if (mapBoxMap.getSource(source) === undefined) {\n mapBoxMap.addSource(source, {\n type: \"geojson\",\n data: {\n type: \"Feature\",\n geometry: {\n type: \"Polygon\",\n coordinates: [res.polygon],\n },\n properties: {},\n },\n });\n }\n\n mapBoxMap.addLayer({\n id: \"lsp-result\",\n type: \"line\",\n source,\n layout: {},\n paint: {\n \"line-color\": \"#000\",\n \"line-width\": 3,\n },\n });\n\n markerPointsRef.current = addTurbinesToMap(\n mapBoxMap,\n res.points.map(([x, y]) => ({ x, y }))\n );\n\n mapBoxMap.setCenter(\n res.polygon\n .reduce((acc, curr) => [acc[0] + curr[0], acc[1] + curr[1]])\n .map((c) => c / res.polygon.length) as [number, number]\n );\n mapBoxMap.setZoom(11);\n }, [mapBoxMap, shownIndex, res]);\n\n return (\n \n View LSP Results\n {shownIndex !== undefined && (\n \n \n setShownIndex(Number(value))}\n type=\"text\"\n />\n \n )}\n {res !== undefined && (\n \n
Mean wind speed
\n
{res.mws.toFixed(2)} m/s
\n
\n )}\n {\n setShownIndex(0);\n setLspResults(\n await getLspResults({ limit: LIMIT.toString(), offset: \"0\" })\n );\n }}\n >\n Start\n \n
\n setShownIndex((i) => (i === undefined ? i : i - 1))}\n >\n Prev\n \n setShownIndex((i) => (i === undefined ? i : i + 1))}\n >\n Next\n \n
\n {\n setShownIndex(undefined);\n setLspResults(undefined);\n }}\n >\n Stop\n \n
\n );\n};\n\nexport default LspResultViewer;\n","// Adapted from https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\nexport const fallbackCopyTextToClipboard = (text: string): void => {\n const textArea = document.createElement(\"textarea\");\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = \"0\";\n textArea.style.left = \"0\";\n textArea.style.position = \"fixed\";\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n const successful = document.execCommand(\"copy\");\n const msg = successful ? \"successful\" : \"unsuccessful\";\n if (!successful) {\n console.error(`Fallback: Copying text command was ${msg}`);\n }\n } catch (err) {\n console.error(\"Fallback: Oops, unable to copy\", err);\n }\n\n document.body.removeChild(textArea);\n};\n\nexport const copyTextToClipboard = (text: string): void => {\n if (!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n navigator.clipboard.writeText(text).then(\n () => {\n // console.log(\"Async: Copying to clipboard was successful!\");\n },\n (err) => {\n console.error(\"Async: Could not copy text: \", err);\n }\n );\n};\n","import { InfoCircleOutlined } from \"@ant-design/icons/lib\";\nimport { Tooltip } from \"antd\";\nimport mapboxgl from \"mapbox-gl\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\nimport Container from \"./Container\";\nimport DataGroup from \"./DataGroup\";\nimport SectionTitle from \"./SectionTitle\";\nimport StyledButton from \"./StyledButton\";\nimport StyledInput from \"./StyledInput\";\n\ninterface Props {\n mapBoxMap: mapboxgl.Map | null;\n loading: boolean;\n}\n\nconst TooltipElement = styled.div`\n display: inline-block;\n margin-left: 2px;\n`;\n\nconst SlopeMask: React.FC = ({ mapBoxMap, loading }) => {\n const [min, setMin] = useState(\"8\");\n const [max, setMax] = useState(\"30\");\n const [currentActiveLayer, setCurrentActiveLayer] = useState<\n string | undefined\n >();\n\n return (\n \n \n Set slope mask (degrees) (minimum zoom 10)\n =10 zoom).\"\n placement=\"right\"\n >\n \n \n \n \n \n \n \n setMin(value)}\n name=\"form-min\"\n id=\"form-min\"\n />\n \n \n \n setMax(value)}\n name=\"form-max\"\n id=\"form-max\"\n />\n \n {\n if (currentActiveLayer !== undefined) {\n mapBoxMap?.removeLayer(currentActiveLayer);\n mapBoxMap?.removeSource(currentActiveLayer);\n }\n\n const name = `slope-mask-${min}-${max}`;\n setCurrentActiveLayer(name);\n mapBoxMap?.addSource(name, {\n type: \"raster\",\n tiles: [\n `https://terracotta.traverse.ai/singleband/continuous/slope/nasadem/30/0/{z}/{x}/{y}.png?colormap=reds&stretch_range=[${min},${max}]`,\n ],\n });\n mapBoxMap?.addLayer({\n id: name,\n type: \"raster\",\n source: name,\n minzoom: 9,\n });\n }}\n >\n Set\n \n {\n if (currentActiveLayer !== undefined) {\n mapBoxMap?.removeLayer(currentActiveLayer);\n mapBoxMap?.removeSource(currentActiveLayer);\n }\n setCurrentActiveLayer(undefined);\n }}\n >\n Remove\n \n \n );\n};\n\nexport default SlopeMask;\n","import mapboxgl, { Visibility } from \"mapbox-gl\";\nimport { TilesetOption } from \"../tilesets\";\n\nexport const getTilesetVisibility = (\n tilesetOption: TilesetOption\n): Visibility => {\n for (const tilesetLayer of tilesetOption.tilesetLayers) {\n if (tilesetLayer.layout?.visibility === \"visible\") {\n return tilesetLayer.layout?.visibility;\n }\n }\n return \"none\";\n};\n\nexport const toggleTilesetVisibility = (\n map: mapboxgl.Map,\n tilesetOption: TilesetOption,\n visibility: Visibility\n): void => {\n for (const tilesetLayer of tilesetOption.tilesetLayers) {\n map.setLayoutProperty(tilesetLayer.id, \"visibility\", visibility);\n }\n};\n","import MapBoxDraw from \"@mapbox/mapbox-gl-draw\";\n// eslint-disable-next-line import/no-unresolved\nimport { Feature } from \"geojson\";\nimport mapboxgl from \"mapbox-gl\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { stringify } from \"wellknown\";\nimport {\n getLspResultsByPolygonFid,\n runSeedLayoutGenerator,\n runSeedLayoutGeneratorWithAdvancedHeuristics,\n sendKmlResults,\n} from \"../api\";\nimport {\n DEFAULT_LAT,\n DEFAULT_LNG,\n DEFAULT_ZOOM,\n LAYERS_LEGEND_MAPPING,\n LAYER_TILESET_MAPPING,\n LSP_SOURCE_LAYERS,\n RASTER_LAYER_OPTIONS,\n VECTOR_LAYER_OPTIONS,\n} from \"../constants\";\nimport {\n ApiState,\n LspResult,\n SlgApiData,\n SlgForm,\n initialSlgForm,\n} from \"../types\";\nimport { addTurbinesToMap } from \"../utils\";\nimport Container from \"./Container\";\n\nimport { LineDrawStyle, PointDrawStyle, PolygonDrawStyle } from \"./DrawStyles\";\nimport LayersControl, { LayerOption } from \"./LayersControl\";\n\nimport LayersLegend, { LayerLegendConfig } from \"./LayersLegend\";\nimport LayoutGeneratorControl from \"./LayoutGeneratorControl\";\nimport LocationIndicator from \"./LocationIndicator\";\nimport LspInfo from \"./LspInfo\";\nimport LspResultShow from \"./LspResultShow\";\nimport LspResultViewer from \"./LspResultViewer\";\nimport { copyTextToClipboard } from \"./MapBoxMapHelper\";\nimport SlopeMask from \"./SlopeMask\";\nimport {\n getTilesetVisibility,\n toggleTilesetVisibility,\n} from \"./TilesetsHelper\";\n\nmapboxgl.accessToken =\n \"pk.eyJ1IjoidGhldGxpbnRodSIsImEiOiJjam4yd3Uyd3AwNjZyM2ttaHVxc2ZoNnJ6In0.cuZ1dRQEGiazjXDScNXgyg\";\n\nconst MapContainer = styled.div`\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100vw;\n`;\n\nconst LeftPanel = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n margin: 12px;\n display: flex;\n align-items: flex-start;\n`;\n\nconst DiscoverBox = styled.div<{ noMarginLeft?: boolean }>`\n z-index: 1;\n display: flex;\n flex-direction: column;\n margin-left: ${({ noMarginLeft }) => (noMarginLeft ? 0 : \"12px\")};\n\n & > * {\n width: 100%;\n }\n\n & > *:not(:last-child) {\n margin-bottom: 8px;\n }\n`;\n\nconst MapBoxMap: React.FC> = () => {\n const mapContainerRef = useRef(null);\n const mapRef = useRef(null);\n const mapBoxDrawRef = useRef(\n new MapBoxDraw({\n displayControlsDefault: false,\n defaultMode: \"draw_polygon\",\n styles: [...PointDrawStyle, ...LineDrawStyle, ...PolygonDrawStyle], // Requires all styles to be defined. Features will not render if styles are not defined\n modes: {\n // @ts-ignore only required key is toDisplayFeatures\n do_nothing: {\n toDisplayFeatures: (state, geojson, display) => display(geojson),\n },\n ...MapBoxDraw.modes,\n },\n })\n );\n const markerPointsRef = useRef([]);\n const ellipseSourceIdsRef = useRef([]);\n\n const [activeVectorLayer, setActiveVectorLayer] = useState(\n VECTOR_LAYER_OPTIONS.filter(\n (opt) =>\n getTilesetVisibility(LAYER_TILESET_MAPPING[opt.layerName]) === \"visible\"\n )\n );\n const [visibleLegendConfigs, setVisibleLegendConfigs] = useState<\n LayerLegendConfig[]\n >(\n activeVectorLayer\n .filter((opt) => opt.layerName in LAYERS_LEGEND_MAPPING)\n .map((opt) => LAYERS_LEGEND_MAPPING[opt.layerName])\n );\n const [drawMode, setDrawMode] = useState(false);\n const [slgForm, setSlgForm] = useState(initialSlgForm);\n const [slgApiState, setSlgApiState] = useState(ApiState.READY);\n const [sendEmailApiState, setSendEmailApiState] = useState(\n ApiState.READY\n );\n const [polygonDrawn, setPolygonDrawn] = useState(\n undefined\n );\n const [apiData, setApiData] = useState(undefined);\n\n const [useAdvancedHeuristics, setUseAdvancedHeuristics] =\n useState(false);\n useEffect(() => {\n const callback = (e: any) =>\n e.code === \"Backquote\" && setUseAdvancedHeuristics((h) => !h);\n document.addEventListener(\"keydown\", callback);\n return () => document.removeEventListener(\"keydown\", callback);\n }, []);\n\n const [lng, setLng] = useState(DEFAULT_LNG);\n const [lat, setLat] = useState(DEFAULT_LAT);\n const [zoom, setZoom] = useState(DEFAULT_ZOOM);\n\n const [lspPolygonId, setLspPolygonId] = useState();\n\n const [loading, setLoading] = useState(true);\n const [lspSelectedData, setLspSelectedData] = useState(\n undefined\n );\n\n useEffect(() => {\n if (mapRef.current) return; // initialize mapRef only once\n if (!mapContainerRef.current) return;\n if (!mapboxgl.supported()) {\n alert(\"Your browser does not support Mapbox GL\");\n }\n\n const mapBoxMap = new mapboxgl.Map({\n container: mapContainerRef.current,\n center: [DEFAULT_LNG, DEFAULT_LAT],\n zoom: DEFAULT_ZOOM,\n style: \"mapbox://styles/thetlinthu/ckrbvwbsh09gh18qi150b5rj8\",\n attributionControl: false,\n });\n\n mapBoxMap\n .addControl(\n new mapboxgl.AttributionControl({\n customAttribution:\n '© Traverse Technologies',\n })\n )\n .addControl(new mapboxgl.ScaleControl(), \"top-right\")\n .on(\"load\", () => {\n setLoading(false);\n mapBoxMap\n .addSource(\"mapbox-dem\", {\n type: \"raster-dem\",\n url: \"mapbox://mapbox.mapbox-terrain-dem-v1\",\n tileSize: 512,\n maxzoom: 14,\n })\n .setTerrain(\n // add the DEM source as a terrain layer with exaggerated height\n { source: \"mapbox-dem\", exaggeration: 1.0 }\n )\n .loadImage(\"./turbine.png\", (err, img) => {\n if (err) {\n throw err;\n }\n if (img === undefined) {\n return;\n }\n mapBoxMap.addImage(\"turbine\", img);\n });\n\n for (const tilesetOption of Object.values(LAYER_TILESET_MAPPING)) {\n for (const [tilesetSourceName, tilesetSource] of Object.entries(\n tilesetOption.tilesetSources\n )) {\n if (!mapBoxMap.getSource(tilesetSourceName)) {\n mapBoxMap.addSource(tilesetSourceName, tilesetSource);\n\n for (const tilesetLayer of tilesetOption.tilesetLayers) {\n if (tilesetLayer.source === tilesetSourceName) {\n mapBoxMap.addLayer(tilesetLayer);\n }\n }\n }\n }\n }\n });\n\n for (const sourceLayer of Object.keys(LSP_SOURCE_LAYERS)) {\n mapBoxMap.on(\"click\", `lspFill-${sourceLayer}`, (e) => {\n // @ts-ignore cast didn't work\n setLspPolygonId(e.features?.[0]?.id);\n });\n mapBoxMap.on(\"click\", `lspFill-contour-${sourceLayer}`, (e) => {\n // @ts-ignore cast didn't work\n setLspPolygonId(e.features?.[0]?.id);\n });\n }\n\n mapBoxMap\n .on(\"mousemove\", ({ lngLat }) => {\n setLng(lngLat.lng);\n setLat(lngLat.lat);\n })\n .on(\"contextmenu\", ({ lngLat }) => {\n try {\n copyTextToClipboard(`${lngLat.lng} ${lngLat.lat}`);\n } catch (err) {\n // This feature is for convenience. When it does not work, we want to avoid all errors.\n }\n })\n .on(\"zoom\", () => {\n setZoom(mapBoxMap.getZoom());\n })\n .on(\"draw.modechange\", ({ mode }) => {\n const numFeatures = mapBoxDrawRef.current.getAll().features.length;\n if (\n !(\n (numFeatures === 0 &&\n [\"draw_polygon\", \"do_nothing\"].includes(mode)) ||\n ([\"simple_select\", \"direct_select\"].includes(mode) &&\n numFeatures === 1)\n )\n ) {\n // If the state of mapboxdraw is invalid we just reset the entire thing\n // and set draw mode to be false.\n // State is valid iff:\n // - mode is draw_polygon / do_nothing and there are 0 features in the map, or\n // - mode is simple_select / direct_select and there is 1 feature in the map.\n setDrawMode(false);\n }\n });\n\n const updateFeaturesDrawn = () => {\n setPolygonDrawn(mapBoxDrawRef.current.getAll().features[0]);\n };\n mapBoxMap\n .on(\"draw.create\", updateFeaturesDrawn)\n .on(\"draw.delete\", updateFeaturesDrawn)\n .on(\"draw.combine\", updateFeaturesDrawn)\n .on(\"draw.uncombine\", updateFeaturesDrawn)\n .on(\"draw.update\", updateFeaturesDrawn);\n\n mapRef.current = mapBoxMap;\n }, []);\n\n useEffect(() => {\n if (\n drawMode &&\n mapRef.current &&\n !mapRef.current.hasControl(mapBoxDrawRef.current)\n ) {\n mapRef.current.addControl(mapBoxDrawRef.current);\n }\n }, [drawMode]);\n\n useEffect(() => {\n if (drawMode && slgApiState !== ApiState.READY) {\n // @ts-ignore custom mode\n mapBoxDrawRef.current?.changeMode(\"do_nothing\");\n }\n }, [drawMode, slgApiState]);\n\n useEffect(() => {\n if (!mapRef.current || mapRef.current.getSource(\"lspFill\") === undefined) {\n return;\n }\n\n for (const sourceLayer of Object.keys(LSP_SOURCE_LAYERS)) {\n mapRef.current.removeFeatureState({\n source: \"lspFill\",\n sourceLayer,\n });\n if (lspPolygonId !== undefined) {\n mapRef.current.setFeatureState(\n {\n id: lspPolygonId,\n source: \"lspFill\",\n sourceLayer,\n },\n { selected: true }\n );\n }\n }\n }, [lspPolygonId]);\n\n const lspCurrentPolygonMarkersRef = useRef([]);\n useEffect(() => {\n (async () => {\n for (const marker of lspCurrentPolygonMarkersRef.current) {\n marker.remove();\n }\n lspCurrentPolygonMarkersRef.current = [];\n\n if (lspPolygonId === undefined || !mapRef.current) {\n return;\n }\n\n setLspSelectedData(undefined);\n const lspResultsForPolygon = await getLspResultsByPolygonFid(\n lspPolygonId\n );\n setLspSelectedData(lspResultsForPolygon);\n\n lspCurrentPolygonMarkersRef.current = addTurbinesToMap(\n mapRef.current,\n lspResultsForPolygon.points.map(([x, y]) => ({ x, y })),\n undefined,\n true\n );\n })();\n }, [lspPolygonId]);\n\n const clearResults = useCallback(() => {\n if (!mapRef.current) return;\n\n for (const marker of markerPointsRef.current) {\n marker.remove();\n }\n markerPointsRef.current = [];\n\n for (const sourceId of ellipseSourceIdsRef.current) {\n mapRef.current.removeLayer(sourceId).removeSource(sourceId);\n }\n ellipseSourceIdsRef.current = [];\n\n setApiData(undefined);\n }, []);\n\n const clearState = useCallback(() => {\n if (!mapRef.current) return;\n\n clearResults();\n\n setSlgApiState(ApiState.READY);\n setSendEmailApiState(ApiState.READY);\n\n if (mapRef.current?.hasControl(mapBoxDrawRef.current)) {\n mapBoxDrawRef.current?.deleteAll();\n mapRef.current.removeControl(mapBoxDrawRef.current);\n }\n\n setSlgForm(initialSlgForm);\n setPolygonDrawn(undefined);\n }, [clearResults]);\n\n useEffect(() => {\n if (!drawMode) {\n clearState();\n }\n }, [drawMode, clearState]);\n\n const toggleLegendVisibility = (\n selectedOption?: LayerOption,\n unselectedOption?: LayerOption\n ) => {\n let nextVisibleLegendConfigs: LayerLegendConfig[] = visibleLegendConfigs;\n if (selectedOption && selectedOption.layerName in LAYERS_LEGEND_MAPPING) {\n nextVisibleLegendConfigs = [\n ...nextVisibleLegendConfigs,\n LAYERS_LEGEND_MAPPING[selectedOption.layerName],\n ];\n }\n if (\n unselectedOption &&\n unselectedOption.layerName in LAYERS_LEGEND_MAPPING\n ) {\n const legendConfig = LAYERS_LEGEND_MAPPING[unselectedOption.layerName];\n nextVisibleLegendConfigs = nextVisibleLegendConfigs.filter(\n (config) => config !== legendConfig\n );\n }\n setVisibleLegendConfigs(nextVisibleLegendConfigs);\n };\n\n const onSelectRaster = (\n selectedOption: LayerOption,\n unselectedOption?: LayerOption\n ) => {\n if (!mapRef.current) return;\n\n if (unselectedOption && unselectedOption.layerName !== \"None\") {\n toggleTilesetVisibility(\n mapRef.current,\n LAYER_TILESET_MAPPING[unselectedOption.layerName],\n \"none\"\n );\n }\n if (selectedOption.layerName !== \"None\") {\n toggleTilesetVisibility(\n mapRef.current,\n LAYER_TILESET_MAPPING[selectedOption.layerName],\n \"visible\"\n );\n }\n toggleLegendVisibility(selectedOption, unselectedOption);\n };\n\n const onToggleVector = (selectedOption: LayerOption, isCheck: boolean) => {\n if (!mapRef.current) return;\n\n let nextActiveVectorLayers: LayerOption[];\n if (isCheck) {\n toggleTilesetVisibility(\n mapRef.current,\n LAYER_TILESET_MAPPING[selectedOption.layerName],\n \"visible\"\n );\n nextActiveVectorLayers = [...activeVectorLayer, selectedOption];\n toggleLegendVisibility(selectedOption, undefined);\n } else {\n toggleTilesetVisibility(\n mapRef.current,\n LAYER_TILESET_MAPPING[selectedOption.layerName],\n \"none\"\n );\n nextActiveVectorLayers = activeVectorLayer.filter(\n (opt) => opt.layerName !== selectedOption.layerName\n );\n toggleLegendVisibility(undefined, selectedOption);\n }\n setActiveVectorLayer(nextActiveVectorLayers);\n };\n\n const onRunAction = async () => {\n if (mapRef.current === null || polygonDrawn === undefined) {\n return;\n }\n\n try {\n setSlgApiState(ApiState.LOADING);\n clearResults();\n // @ts-ignore stringify signature mistake\n const wkt = stringify(polygonDrawn);\n const result = await (useAdvancedHeuristics\n ? runSeedLayoutGeneratorWithAdvancedHeuristics(\n wkt,\n Number(slgForm.maxCapacity),\n slgForm.setAdvancedSettings,\n Number(slgForm.superfuncA),\n Number(slgForm.superfuncB),\n Number(slgForm.superfuncC),\n Number(slgForm.superfuncMultiplier),\n Number(slgForm.slopefuncDropSteepness),\n Number(slgForm.slopefuncHalfPoint),\n Number(slgForm.proximityMultiplier),\n Number(slgForm.proximityPower),\n Number(slgForm.wakeMaxDownwindDistancePerDiameter),\n Number(slgForm.wakeK),\n Number(slgForm.wakeCt),\n Number(slgForm.elevationAreaFactor),\n Number(slgForm.elevationPowerFactor),\n Number(slgForm.elevationOverallFactor),\n slgForm.setAdvancedSettings ? Number(slgForm.mw) : undefined,\n slgForm.setAdvancedSettings ? Number(slgForm.diameter) : undefined,\n slgForm.setAdvancedSettings\n ? Number(slgForm.ellipseMajor)\n : undefined,\n slgForm.setAdvancedSettings\n ? Number(slgForm.ellipseMinor)\n : undefined,\n slgForm.setAdvancedSettings\n ? Number(slgForm.ellipseRotation)\n : undefined\n )\n : runSeedLayoutGenerator(\n wkt,\n Number(slgForm.maxCapacity),\n slgForm.setAdvancedSettings,\n slgForm.setAdvancedSettings ? Number(slgForm.mw) : undefined,\n slgForm.setAdvancedSettings ? Number(slgForm.diameter) : undefined,\n slgForm.setAdvancedSettings\n ? Number(slgForm.ellipseMajor)\n : undefined,\n slgForm.setAdvancedSettings\n ? Number(slgForm.ellipseMinor)\n : undefined,\n slgForm.setAdvancedSettings\n ? Number(slgForm.ellipseRotation)\n : undefined\n ));\n\n markerPointsRef.current = markerPointsRef.current.concat(\n addTurbinesToMap(mapRef.current, result.points, {\n ellipseSourceIdNaming: (idx) => `ellipse-${idx}`,\n ellipseBaseDiameter: result.ellipse_base_diameter,\n ellipseMajor: result.ellipse_major,\n ellipseMinor: result.ellipse_minor,\n ellipseRotation: result.ellipse_rotation,\n })\n );\n ellipseSourceIdsRef.current = ellipseSourceIdsRef.current.concat(\n result.points.map((_, idx) => `ellipse-${idx}`)\n );\n setSlgApiState(ApiState.FINISHED);\n setApiData({\n sentData: { ...slgForm },\n sentPolygon: polygonDrawn,\n result: result.points,\n message: result.turbine_class_message,\n turbineName: result.turbine_name,\n turbineCapacity: result.turbine_capacity,\n ellipseBaseDiameter: result.ellipse_base_diameter,\n ellipseMajor: result.ellipse_major,\n ellipseMinor: result.ellipse_minor,\n ellipseRotation: result.ellipse_rotation,\n averageWindSpeed:\n result.points.reduce((acc, point) => acc + point.ws, 0) /\n result.points.length,\n capacityFactor: result.capacity_factor,\n });\n } catch (e) {\n console.error(e);\n setSlgApiState(ApiState.ERROR);\n }\n };\n\n const onSendEmailAction = async () => {\n if (mapRef.current === null || apiData === undefined) {\n return;\n }\n\n try {\n setSendEmailApiState(ApiState.LOADING);\n\n // @ts-ignore stringify signature mistake\n const wkt = stringify(apiData.sentPolygon);\n await sendKmlResults(\n wkt,\n slgForm.windFarmName,\n Number(slgForm.maxCapacity),\n slgForm.setAdvancedSettings,\n apiData.message,\n slgForm.email,\n apiData.result,\n apiData.turbineCapacity,\n apiData.ellipseBaseDiameter,\n apiData.ellipseMajor,\n apiData.ellipseMinor,\n apiData.ellipseRotation\n );\n setSendEmailApiState(ApiState.FINISHED);\n } catch (e) {\n console.error(e);\n setSendEmailApiState(ApiState.ERROR);\n }\n };\n\n return (\n <>\n \n \n \n layerName === \"None\"\n )}\n selectedVectorOptions={activeVectorLayer}\n onSelectRaster={onSelectRaster}\n onToggleVector={onToggleVector}\n />\n \n \n setDrawMode(true)}\n onRunAction={onRunAction}\n onResetAction={() => setDrawMode(false)}\n onSendEmailAction={onSendEmailAction}\n drawMode={drawMode}\n slgForm={slgForm}\n setSlgForm={setSlgForm}\n slgApiState={slgApiState}\n sendEmailApiState={sendEmailApiState}\n polygonDrawn={polygonDrawn}\n apiData={apiData}\n useAdvancedHeuristics={useAdvancedHeuristics}\n />\n {useAdvancedHeuristics && (\n \n )}\n \n \n \n \n \n \n \n \n \n \n 3D Mode: Right Click and Pan\n \n \n \n Click Here for Tutorial\n \n \n \n \n \n \n \n );\n};\n\nexport default MapBoxMap;\n","import React from \"react\";\n\nimport styled from \"styled-components\";\nimport Header from \"./components/Header\";\nimport MapBoxMap from \"./components/MapBoxMap\";\n\nconst Content = styled.div`\n position: relative;\n height: calc(100vh - 40px);\n`;\n\nconst App: React.FC> = () => {\n return (\n <>\n
\n \n \n \n \n );\n};\n\nexport default App;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport \"@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css\";\nimport \"antd/dist/antd.css\";\nimport \"./fonts/style.css\";\nimport \"./index.css\";\n\nimport App from \"./App\";\n// import reportWebVitals from \"./reportWebVitals\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\n// eslint-disable-next-line no-console\n// reportWebVitals(console.log);\n"],"sourceRoot":""}