| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 | "use strict";var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {    if (k2 === undefined) k2 = k;    var desc = Object.getOwnPropertyDescriptor(m, k);    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {      desc = { enumerable: true, get: function() { return m[k]; } };    }    Object.defineProperty(o, k2, desc);}) : (function(o, m, k, k2) {    if (k2 === undefined) k2 = k;    o[k2] = m[k];}));var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {    Object.defineProperty(o, "default", { enumerable: true, value: v });}) : function(o, v) {    o["default"] = v;});var __importStar = (this && this.__importStar) || function (mod) {    if (mod && mod.__esModule) return mod;    var result = {};    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);    __setModuleDefault(result, mod);    return result;};var __rest = (this && this.__rest) || function (s, e) {    var t = {};    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)        t[p] = s[p];    if (s != null && typeof Object.getOwnPropertySymbols === "function")        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))                t[p[i]] = s[p[i]];        }    return t;};Object.defineProperty(exports, "__esModule", { value: true });exports.GeoView = void 0;const scale_1 = require("@antv/scale");const util_1 = require("@antv/util");const d3_geo_1 = require("d3-geo");const mark_1 = require("../utils/mark");const d3Projection = __importStar(require("./d3Projection"));/** * Get projection factory from d3-projection. */function normalizeProjection(type) {    if (typeof type === 'function')        return type;    const name = `geo${(0, util_1.upperFirst)(type)}`;    const projection = d3Projection[name];    if (!projection)        throw new Error(`Unknown coordinate: ${type}`);    return projection;}/** * @see https://github.com/mapbox/geojson-merge/blob/master/index.js */function mergeGeoJSON(gjs) {    return {        type: 'FeatureCollection',        features: gjs.flatMap((gj) => normalizeGeoJSON(gj).features),    };}function normalizeGeoJSON(gj) {    const types = {        Point: 'geometry',        MultiPoint: 'geometry',        LineString: 'geometry',        MultiLineString: 'geometry',        Polygon: 'geometry',        MultiPolygon: 'geometry',        GeometryCollection: 'geometry',        Feature: 'feature',        FeatureCollection: 'featureCollection',    };    if (!gj || !gj.type)        return null;    const type = types[gj.type];    if (!type)        return null;    if (type === 'geometry') {        return {            type: 'FeatureCollection',            features: [                {                    type: 'Feature',                    properties: {},                    geometry: gj,                },            ],        };    }    else if (type === 'feature') {        return {            type: 'FeatureCollection',            features: [gj],        };    }    else if (type === 'featureCollection') {        return gj;    }}/** * Specify the options for d3 projection * @see https://github.com/d3/d3-geo#projections * @todo Specify key each by each. */function setProjectionOptions(projection, options) {    var _a;    for (const [key, value] of Object.entries(options)) {        (_a = projection[key]) === null || _a === void 0 ? void 0 : _a.call(projection, value);    }}function setProjectionSize(projection, nodes, layout, options) {    const defaultOutline = () => {        const geoNodes = nodes.filter(isGeoPath);        // For geoPath with sphere mark, use it as outline.        const sphere = geoNodes.find((d) => d.sphere);        if (sphere)            return { type: 'Sphere' };        // Merge all GeoJSON as the outline.        return mergeGeoJSON(geoNodes.filter((d) => !d.sphere).flatMap((d) => d.data.value));    };    const { outline = defaultOutline() } = options;    const { size = 'fitExtent' } = options;    if (size === 'fitExtent') {        return setFitExtent(projection, outline, layout);    }    else if (size === 'fitWidth') {        return setFitWidth(projection, outline, layout);    }}function setFitExtent(projection, object, layout) {    const { x, y, width, height } = layout;    projection.fitExtent([        [x, y],        [width, height],    ], object);}function setFitWidth(projection, object, layout) {    const { width, height } = layout;    const [[x0, y0], [x1, y1]] = (0, d3_geo_1.geoPath)(projection.fitWidth(width, object)).bounds(object);    const dy = Math.ceil(y1 - y0);    const l = Math.min(Math.ceil(x1 - x0), dy);    const s = (projection.scale() * (l - 1)) / l;    const [tx, ty] = projection.translate();    const t = ty + (height - dy) / 2;    projection.scale(s).translate([tx, t]).precision(0.2);}/** * @todo Remove this. */function normalizeDataSource(node) {    const { data } = node;    if (Array.isArray(data))        return Object.assign(Object.assign({}, node), { data: { value: data } });    const { type } = data;    if (type === 'graticule10') {        return Object.assign(Object.assign({}, node), { data: { value: [(0, d3_geo_1.geoGraticule10)()] } });    }    else if (type === 'sphere') {        // Sphere is not a standard type of GeoJSON.        // Mark this geoPath as sphere geoPath.        return Object.assign(Object.assign({}, node), { sphere: true, data: { value: [{ type: 'Sphere' }] } });    }    return node;}function isGeoPath(d) {    return d.type === 'geoPath';}/** * A view with geo coordinate. */const GeoView = () => {    return (options) => {        const { children, coordinate: projection = {} } = options;        if (!Array.isArray(children))            return [];        // Get projection factory.        const { type = 'equalEarth' } = projection, projectionOptions = __rest(projection, ["type"]);        const createProjection = normalizeProjection(type);        const nodes = children.map(normalizeDataSource);        // Set path generator lazily.        let path;        // A custom geo coordinate.        function Geo() {            return [                [                    'custom',                    (x, y, width, height) => {                        // Create and set projection.                        const visual = createProjection();                        const layout = { x, y, width, height };                        setProjectionSize(visual, nodes, layout, projectionOptions);                        setProjectionOptions(visual, projectionOptions);                        // Create path generator.                        path = (0, d3_geo_1.geoPath)(visual);                        // Normalize projection and projection.invert,                        // which normalize projected points.                        const scaleX = new scale_1.Linear({                            domain: [x, x + width],                        });                        const scaleY = new scale_1.Linear({                            domain: [y, y + height],                        });                        const normalize = (point) => {                            const visualPoint = visual(point);                            if (!visualPoint)                                return null;                            const [vx, vy] = visualPoint;                            return [scaleX.map(vx), scaleY.map(vy)];                        };                        const normalizeInvert = (point) => {                            if (!point)                                return null;                            const [px, py] = point;                            const visualPoint = [scaleX.invert(px), scaleY.invert(py)];                            return visual.invert(visualPoint);                        };                        return {                            transform: (point) => normalize(point),                            untransform: (point) => normalizeInvert(point),                        };                    },                ],            ];        }        function GeoPath(options) {            const { style, tooltip = {} } = options;            return Object.assign(Object.assign({}, options), { type: 'path', tooltip: (0, mark_1.maybeTooltip)(tooltip, {                    title: 'id',                    items: [{ channel: 'color' }],                }), style: Object.assign(Object.assign({}, style), { d: (d) => path(d) || [] }) });        }        const t = (d) => (isGeoPath(d) ? GeoPath(d) : d);        return [            Object.assign(Object.assign({}, options), { type: 'view', scale: {                    x: { type: 'identity' },                    y: { type: 'identity' },                }, axis: false, coordinate: { type: Geo }, children: nodes.flatMap(t) }),        ];    };};exports.GeoView = GeoView;exports.GeoView.props = {};//# sourceMappingURL=geoView.js.map
 |