@ugrc/layer-selector
Version:
This is a react component for adding a quick base map selector with a happy path for using [UGRC's Discover Service](https://gis.utah.gov/discover).
218 lines (198 loc) • 5.96 kB
JSX
import FeatureLayer from '@arcgis/core/layers/FeatureLayer.js';
import TileInfo from '@arcgis/core/layers/support/TileInfo.js';
import TileLayer from '@arcgis/core/layers/TileLayer.js';
import VectorTileLayer from '@arcgis/core/layers/VectorTileLayer.js';
import WebTileLayer from '@arcgis/core/layers/WebTileLayer.js';
import Map from '@arcgis/core/Map.js';
import MapView from '@arcgis/core/views/MapView.js';
import PropTypes from 'prop-types';
import { useEffect, useRef, useState } from 'react';
import LayerSelector from './';
import '@arcgis/core/assets/esri/themes/light/main.css';
import './LayerSelector.css';
export default {
component: LayerSelector,
};
const WithMap = ({
center,
zoom,
scale,
baseLayers,
overlays,
showOpacitySlider,
}) => {
const mapDiv = useRef();
const [layerSelectorOptions, setLayerSelectorOptions] = useState();
useEffect(() => {
const initMap = () => {
console.log('init');
const map = new Map();
const view = new MapView({
container: mapDiv.current,
map,
center: center ? center : [-112, 40],
zoom,
scale,
});
setLayerSelectorOptions({
view: view,
quadWord: import.meta.env.VITE_QUAD_WORD,
baseLayers: baseLayers
? baseLayers
: [
'Hybrid',
'Lite',
'Terrain',
'Topo',
'Color IR',
{
id: 'Vision Refresh Basemap',
Factory: 'TileLayer',
url: 'https://gis.wfrc.org/arcgis/rest/services/WC2050Vision/2023_Vision_Refresh_Basemap/MapServer/',
opacity: 0.25,
},
],
overlays: overlays ? overlays : ['Address Points'],
position: 'top-right',
showOpacitySlider,
});
};
initMap();
}, [zoom, center, scale, baseLayers, overlays, showOpacitySlider]);
return (
<div
ref={mapDiv}
style={{ position: 'absolute', top: 0, left: 0, bottom: 0, right: 0 }}
>
{layerSelectorOptions ? (
<LayerSelector {...layerSelectorOptions}></LayerSelector>
) : null}
</div>
);
};
WithMap.propTypes = {
center: PropTypes.arrayOf(PropTypes.number),
zoom: PropTypes.number,
scale: PropTypes.number,
baseLayers: PropTypes.array,
overlays: PropTypes.array,
showOpacitySlider: PropTypes.bool,
};
export const Zoom = () => <WithMap zoom={6} />;
export const Scale = () => <WithMap scale={12000} />;
export const NoZoomOrScale = () => <WithMap />;
export const ZoomAndScale = () => <WithMap zoom={6} scale={12000} />;
export const CustomLOD = () => {
const tileSize = 256;
const earthCircumference = 40075016.685568;
const inchesPerMeter = 39.37;
const initialResolution = earthCircumference / tileSize;
const lods = [];
for (let zoom = 0; zoom <= 20; zoom++) {
let resolution = initialResolution / Math.pow(2, zoom);
let scale = resolution * 96 * inchesPerMeter;
lods.push({
level: zoom,
scale: scale,
resolution: resolution,
});
}
const baseLayers = [
{
Factory: WebTileLayer,
urlTemplate:
'http://{subDomain}.tile.stamen.com/toner/{level}/{col}/{row}.png',
id: 'Imagery',
subDomains: ['a', 'b', 'c', 'd'],
selected: true,
tileInfo: new TileInfo({
dpi: 96,
rows: 256,
cols: 256,
origin: {
x: -20037508.342787,
y: 20037508.342787,
},
spatialReference: {
wkid: 102100,
},
lods: lods,
}),
},
];
return <WithMap zoom={6} baseLayers={baseLayers} />;
};
export const LinkedOverlays = () => {
const baseLayers = [
{
Factory: TileLayer,
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer',
id: 'Topo',
linked: ['Cities'],
},
{
Factory: TileLayer,
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer',
id: 'Terrain',
linked: ['Counties'],
},
];
const overlays = [
{
Factory: FeatureLayer,
url: 'https://services1.arcgis.com/99lidPhWCzftIe9K/arcgis/rest/services/UtahMunicipalBoundaries/FeatureServer/0',
id: 'Cities',
},
{
Factory: FeatureLayer,
url: 'https://services1.arcgis.com/99lidPhWCzftIe9K/arcgis/rest/services/UtahCountyBoundaries/FeatureServer/0',
id: 'Counties',
},
];
return <WithMap zoom={6} baseLayers={baseLayers} overlays={overlays} />;
};
export const DefaultSelection = () => {
const baseLayers = [
{
Factory: TileLayer,
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer',
id: 'Topo',
},
{
Factory: TileLayer,
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer',
id: 'Terrain',
selected: true,
},
];
const overlays = [
{
Factory: FeatureLayer,
url: 'https://services1.arcgis.com/99lidPhWCzftIe9K/arcgis/rest/services/UtahMunicipalBoundaries/FeatureServer/0',
id: 'Cities',
selected: true,
},
{
Factory: FeatureLayer,
url: 'https://services1.arcgis.com/99lidPhWCzftIe9K/arcgis/rest/services/UtahCountyBoundaries/FeatureServer/0',
id: 'Counties',
},
];
return <WithMap zoom={6} baseLayers={baseLayers} overlays={overlays} />;
};
export const LandOwnership = () => {
const landOwnershipOptions = {
overlays: [
'Address Points',
{
Factory: VectorTileLayer,
url: 'https://gis.trustlands.utah.gov/hosting/rest/services/Hosted/Land_Ownership_WM_VectorTile/VectorTileServer',
id: 'Land Ownership',
opacity: 0.3,
},
],
zoom: 10,
};
return <WithMap {...landOwnershipOptions} />;
};
export const OpacitySlider = () => <WithMap showOpacitySlider zoom={6} />;