[Kepler.gl][web]是一个与数据无关的、高性能的基于Web的应用程序,用于大规模地理位置数据集的可视化探索。它基于MapLibre GL和deck.gl构建,kepler.gl可以渲染数百万个点,代表数千次行程,并实时执行空间聚合。
Kepler.gl也是一个React组件,使用Redux来管理其状态和数据流。它可以嵌入到其他React-Redux应用程序中,并且高度可定制。关于如何在你的应用中嵌入kepler.gl,请查看vis.academy上的这个分步[教程][vis-academy]。
使用Node 18.18.2或以上版本,不支持/未测试旧版本的node。
为获得最佳结果,使用nvm nvm install
。
安装node(> 18.18.2
)、yarn和项目依赖
npm install --save kepler.gl // 或 yarn add kepler.gl
kepler.gl基于[mapbox][mapbox]构建。你需要一个[Mapbox访问令牌][mapbox-token]才能使用它。
如果你不使用模块打包器,也没关系。Kepler.gl npm包在umd文件夹中包含预编译的生产UMD构建。 你可以按如下方式将脚本标签添加到你的html文件中:
<script src="https://unpkg.com/kepler.gl/umd/keplergl.min.js" />
或者如果你愿意,你可以加载特定版本
<script src="https://unpkg.com/kepler.gl@2.5.5/umd/keplergl.min.js" />
查看[开发指南][developers]以在本地开发kepler.gl。
以下是将kepler.gl导入到你的应用程序的基本步骤。你也可以查看examples文件夹。文件夹中的每个示例都可以安装和本地运行。
Kepler.gl使用Redux管理其内部状态,并使用[react-palm][react-palm]中间件处理副作用。
你还需要将react-palm
的taskMiddleware
添加到你的store中。我们正在积极开发一个不需要react-palm
的解决方案,但它仍然是一个非常轻量级的副作用管理工具,比react-thunk更容易测试。
import {createStore, combineReducers, applyMiddleware, compose} from 'redux'; import keplerGlReducer from '@kepler.gl/reducers'; import {enhanceReduxMiddleware} from '@kepler.gl/middleware'; const initialState = {}; const reducers = combineReducers({ // <-- 在你的应用中挂载kepler.gl reducer keplerGl: keplerGlReducer, // 你的其他reducers在这里 app: appReducer }); // 使用createStore export default createStore( reducer, initialState, applyMiddleware( enhanceReduxMiddleware([ /* 在这里添加其他中间件 */ ]) ) );
或者如果使用enhancer:
// 使用enhancers const initialState = {}; const middlewares = enhanceReduxMiddleware([ // 在这里添加其他中间件 ]); const enhancers = [applyMiddleware(...middlewares)]; export default createStore(reducer, initialState, compose(...enhancers));
如果你将kepler.gl reducer挂载在keplerGl
以外的地址,或者kepler.gl reducer没有挂载在你的状态的根部,你需要在使用getState
属性挂载组件时指定它的路径。
阅读更多关于[Reducers][reducers]的信息。
import KeplerGl from '@kepler.gl/components'; const Map = props => ( <KeplerGl id="foo" width={width} mapboxApiAccessToken={token} height={height} /> );
id
(字符串,必需)map
此KeplerGl实例的id。如果你的应用中有多个KeplerGl实例,则id
是必需的。它定义了存储在KeplerGl reducer中的KeplerGl状态的属性名。例如,id为foo
的KeplerGl组件的状态存储在state.keplerGl.foo
中。
如果你使用相同的id创建多个kepler.gl实例,由该条目定义的kepler.gl状态将被最新实例覆盖并重置为空白状态。
mapboxApiAccessToken
(字符串,必需*)undefined
默认情况下,kepler.gl使用mapbox-gl.js渲染其基础地图。你可以在[mapbox][mapbox]创建一个免费账户,并在[www.mapbox.com/account/access-tokens][mapbox-token]创建一个令牌。
如果你用自己的地图样式替换了kepler.gl的默认地图样式,并且它们不是Mapbox样式,则不需要mapboxApiAccessToken
。
阅读更多关于[自定义地图样式][custom-map-styles]的信息。
getState
(函数,可选)state => state.keplerGl
你的reducer中根keplerGl状态的路径。
width
(数字,可选)800
KeplerGl UI的宽度。
height
(数字,可 选)800
appName
(字符串,可选)Kepler.Gl
在侧面板头部显示的应用名称
version
(字符串,可选)v1.0
在侧面板头部显示的版本
onSaveMap
(函数,可选)undefined
在侧面板头部点击保存地图URL时调用的操作。
onViewStateChange
(函数,可选)undefined
viewState
- 包含经度、纬度、缩放等参数的更新后的视图状态对象当地图视口更新时触发的操作。
getMapboxRef(mapbox, index)
(函数,可选)undefined
当KeplerGL
添加或移除包含内部Mapbox地图的MapContainer
组件时调用的函数。
mapbox
参数在添加时是一个MapRef
,在移除时是null
。
index
参数对单个地图为0,对额外的地图为1(因为KeplerGL
支持可选的分屏地图视图)。
actions
(对象,可选){}
用于替换默认kepler.gl action创建器的action创建器。仅在需要修改action payload时使用自定义action。
mint
(布尔值,可选)true
组件挂载时是否加载全新的空白状态。当传入mint: true
时,kepler.gl组件在重新挂载相同组件时总是加载新的状态,该组件内的状态在卸载时将被销毁。
传入mint: false
时,kepler.gl将在组件卸载后仍保留其状态在store中,并 在重新挂载时将其用作初始状态。这在模态框中挂载kepler.gl并在重新打开时保持相同地图时很有用。
阅读更多关于[组件][components]的信息。
theme
(对象 | 字符串,可选)null
可选值为"dark"
、"light"
或"base"
你可以传入主题名称或用于自定义Kepler.gl样式的对象。Kepler.gl除默认的"dark"主题外还提供了"light"主题。当传入主题对象时,Kepler.gl将使用传入的值覆盖theme中的值。
阅读更多关于[自定义主题][custom-theme]的信息
mapboxApiUrl
(字符串,可选)https://api.mapbox.com
如果你使用自己的mapbox瓦片服务器,可以传入你自己的瓦片服务器API URL。
mapStylesReplaceDefault
(布尔值,可选)false
kepler.gl提供4种地图样式可供选择。如果你想提供自己的mapStyles
,请传入true
。详见下文。
mapStyles
(数组,可选)[]
你可以提供额外的地图样式在地图样式选择面板中显示。默认情况下,额外的地图样式将添加到默认地图样式中。如果传入mapStylesReplaceDefault: true
,它们将替换默认样式。kepler.gl将尝试根据你的样式的id
命名约定对图层进行分组,并用它来允许切换基础地图图层的可见性。提供你自己的layerGroups
来覆盖默认值以实现更准确的图层分组。
每个mapStyles
应具有以下属性:
id
(字符串,必需) 唯一字符串,不应为以下保留值之一:dark
light
muted
muted_night
label
(字符串,必需) 在地图样式选择面板中显示的名称url
(字符串,必需) mapbox样式url或指向按照Mapbox GL样式规范编写的地图样式json对象的urlicon
(字符串,可选) 样式的图标图片,可以是url或图片数据urllayerGroups
(数组,可选)const mapStyles = [ { id: 'my_dark_map', label: 'Dark Streets 9', url: 'mapbox://styles/mapbox/dark-v9', icon: `${apiHost}/styles/v1/mapbox/dark-v9/static/-122.3391,37.7922,9.19,0,0/400x300?access_token=${accessToken}&logo=false&attribution=false`, layerGroups: [ { slug: 'label', filter: ({id}) => id.match(/(?=(label|place-|poi-))/), defaultVisibility: true }, { // 添加这个将保留3D建筑选项 slug: '3d building', filter: () => false, defaultVisibility: false } ] } ];
阅读更多关于[自定义地图样式][custom-map-styles]的信息。
initialUiState
(对象,可选)undefined
应用于uiState reducer的初始UI状态,值将与默认的INITIAL_UI_STATE
进行浅合并
localeMessages
(对象,可选)undefined
修改默认翻译或添加新翻译阅读更多关于[本地化][localization]的信息。
keplerGl
reducer分发自定义actions。使用reducer而不是React组件状态来处理keplerGl状态的一个优势是可以灵活地自定义其行为。如果你的应用中只有一个KeplerGl
实例,或者从不打算从组件外部向KeplerGl分发actions,
你无需担心转发dispatch,可以直接进入下一节。但生活充满定制,我们希望让你的体验尽可能愉快。
有多种方法可以向特定的KeplerGl
实例分发actions。
kepler.gl中的每个action都映射到一个reducer更新器。你可以导入与特定action对应的reducer更新器,并使用前一个状态和action payload调用它来获取更新后的状态。
例如,updateVisDataUpdater
是ActionTypes.UPDATE_VIS_DATA
的更新器(查看每个reducer reducers/vis-state.js
以了解action到更新器的映射)。
这里有一个示例,说明如何监听应用action QUERY_SUCCESS
并调用updateVisDataUpdater
将数据加载到Kepler.Gl中。
import keplerGlReducer, {visStateUpdaters} from 'kepler.gl/reducers'; // 根Reducer const reducers = combineReducers({ keplerGl: keplerGlReducer, app: appReducer }); const composedReducer = (state, action) => { switch (action.type) { case 'QUERY_SUCCESS': return { ...state, keplerGl: { ...state.keplerGl, // 'map'是keplerGl实例的id map: { ...state.keplerGl.map, visState: visStateUpdaters.updateVisDataUpdater(state.keplerGl.map.visState, { datasets: action.payload }) } } }; } return reducers(state, action); }; export default composedReducer;
阅读更多关于[使用更新器修改kepler.gl状态][using-updaters]的信息
connect
你可以使用connect为组件添加一个dispatch函数,该函数向特定的keplerGl
组件分发actions。
// 组件 import KeplerGl from '@kepler.gl/components'; // action和forward dispatcher import {toggleFullScreen, forwardTo} from '@kepler.gl/actions'; import {connect} from 'react-redux'; const MapContainer = props => ( <div> <button onClick={() => props.keplerGlDispatch(toggleFullScreen())}/> <KeplerGl id="foo" /> </div> ) const mapStateToProps = state => state const mapDispatchToProps = (dispatch, props) => ({ dispatch, keplerGlDispatch: forwardTo('foo', dispatch) }); export default connect( mapStateToProps, mapDispatchToProps )(MapContainer);
你也可以简单地使用wrapTo
辅助函数将action包装成一个forward action
// 组件 import KeplerGl from '@kepler.gl/components'; // action和forward dispatcher import {toggleFullScreen, wrapTo} from '@kepler.gl/actions'; // 创建一个函数将action payload包装到'foo' const wrapToMap = wrapTo('foo'); const MapContainer = ({dispatch}) => ( <div> <button onClick={() => dispatch(wrapToMap(toggleFullScreen())} /> <KeplerGl id="foo" /> </div> );
阅读更多关于[转发分发actions][forward-actions]的信息
Kepler.gl使用Styled-Components实现CSS样式。通过使用该框架,Kepler.gl提供了以下方式来自定义其样式/主题:
可自定义的属性列表在这里theme。
你可以通过向Kepler.gl React组件传递theme props来自定义Kepler.gl主题,如下所示:
const white = '#ffffff'; const customTheme = { sidePanelBg: white, titleTextColor: '#000000', sidePanelHeaderBg: '#f7f7F7', subtextColorActive: '#2473bd' }; return ( <KeplerGl mapboxApiAccessToken={MAPBOX_TOKEN} id="map" width={800} height={800} theme={customTheme} /> );
如你所见,customTheme 对象定义了某些属性,这些属性将覆盖 Kepler.gl 的默认样式规则。
为了使用 ThemeProvider 自定义 Kepler.gl 主题,你可以简单地用 ThemeProvider 包装 Kepler.gl,如下所示:
import {ThemeProvider} from 'styled-components'; const white = '#ffffff'; const customTheme = { sidePanelBg: white, titleTextColor: '#000000', sidePanelHeaderBg: '#f7f7F7', subtextColorActive: '#2473bd' }; return ( <ThemeProvider theme={customTheme}> <KeplerGl mapboxApiAccessToken={MAPBOX_TOKEN} id="map" width={800} height={800} /> </ThemeProvider> );
每个人都希望能灵活地渲染自定义的 kepler.gl 组件。Kepler.gl 有一个依赖注入系统,允许你注入组件到 KeplerGl 中替换现有的组件。你只需要为你想要替换的组件创建一个组件工厂,导入原始组件工厂,并在你的应用程序中挂载 KeplerGl 的根组件处调用 injectComponents
。
看看 examples/demo-app/src/app.js
,看它如何在 kepler.gl 中渲染自定义侧面板头部
import {injectComponents, PanelHeaderFactory} from '@kepler.gl/components'; // 定义自定义头部 const CustomHeader = () => <div>我的 kepler.gl 应用</div>; const myCustomHeaderFactory = () => CustomHeader; // 将自定义头部注入到 Kepler.gl 中,替换默认头部 const KeplerGl = injectComponents([[PanelHeaderFactory, myCustomHeaderFactory]]); // 渲染 KeplerGl,它将渲染你的自定义头部而不是默认头部 const MapContainer = () => ( <div> <KeplerGl id="foo" /> </div> );
使用 withState
辅助函数将 reducer 状态和动作作为额外的 props 添加到自定义组件中。
import {withState, injectComponents, PanelHeaderFactory} from '@kepler.gl/components'; import {visStateLens} from '@kepler.gl/reducers'; // 自定义动作包装到挂载的实例 const addTodo = text => wrapTo('map', { type: 'ADD_TODO', text }); // 定义自定义头部 const CustomHeader = ({visState, addTodo}) => ( <div onClick={() => addTodo('hello')}>{`已加载 ${ Object.keys(visState.datasets).length } 个数据集`}</div> ); // 现在 CustomHeader 将接收 `visState` 和 `addTodo` 作为额外的 props const myCustomHeaderFactory = () => withState( // keplerGl 状态镜头 [visStateLens], // 自定义 mapStateToProps headerStateToProps, // 动作 {addTodo} )(CustomHeader);
阅读更多关于[替换 UI 组件][replace-ui-component]的内容
要与 kepler.gl 实例交互并向其添加新数据,你可以在应用程序内的任何地方调度 addDataToMap
动作。它向 kepler.gl 实例添加一个或多个数据集,并更新完整的配置(mapState、mapStyle、visState)。
data
[Object][40] *必需
datasets
([Array][41]<[Object][40]> | [Object][40]) *必需 datasets 可以是一个数据集或数据集数组
每个数据集对象需要有 info
和 data
属性。
datasets.info
[Object][40] -数据集的信息
datasets.info.id
[string][42] 此数据集的 id。如果定义了 config,id
应该与 config 中的 dataId
匹配。datasets.info.label
[string][42] 此数据集的显示名称datasets.data
[Object][40] *必需 数据对象,以表格格式包含 2 个属性 fields
和 rows
datasets.data.fields
[Array][41]<[Object][40]> *必需 字段数组,
datasets.data.fields.name
[string][42] *必需 字段名称,datasets.data.rows
[Array][41]<[Array][41]> *必需 行数组,以表格格式包含 fields
和 rows
options
[Object][40]
options.centerMap
[boolean][43] 默认值: true
如果 centerMap
设置为 true
,kepler.gl 将把地图视图放置在数据点边界内options.readOnly
[boolean][43] 默认值: false
如果 readOnly
设置为 true
,左侧设置面板将被隐藏options.keepExistingConfig
[boolean][43] 默认值: false
是否保留现有的地图配置,包括图层、过滤器和分割地图。config
[Object][40] 此对象将包含完整的 kepler.gl 实例配置 {mapState, mapStyle, visState}
Kepler.gl 提供了一个简单的 API KeplerGlSchema.getConfigToSave
来生成当前 kepler 实例配置的 json blob。
// app.js import {addDataToMap} from '@kepler.gl/actions'; const sampleTripData = { fields: [ {name: 'tpep_pickup_datetime', format: 'YYYY-M-D H:m:s', type: 'timestamp'}, {name: 'pickup_longitude', format: '', type: 'real'}, {name: 'pickup_latitude', format: '', type: 'real'} ], rows: [ ['2015-01-15 19:05:39 +00:00', -73.99389648, 40.75011063], ['2015-01-15 19:05:39 +00:00', -73.97642517, 40.73981094], ['2015-01-15 19:05:40 +00:00', -73.96870422, 40.75424576] ] }; const sampleConfig = { visState: { filters: [ { id: 'me', dataId: 'test_trip_data', name: 'tpep_pickup_datetime', type: 'timeRange', view: 'enlarged' } ] } }; this.props.dispatch( addDataToMap({ datasets: { info: { label: '纽约市示例出租车行程', id: 'test_trip_data' }, data: sampleTripData }, option: { centerMap: true, readOnly: false }, config: sampleConfig }) );
阅读更多关于 addDataToMap 和[使用模式管理器保存和加载地图][saving-loading-w-schema]的内容。 [contributing]: contributing/README.md [demo-app]: http://kepler.gl/#/demo [github]: https://github.com/keplergl/kepler.gl [github-pr]: https://help.github.com/articles/creating-a-pull-request/ [mapbox]: https://www.mapbox.com [mapbox-token]: https://www.mapbox.com/help/define-access-token/ [developers]: contributing/DEVELOPERS.md [examples]: https://github.com/keplergl/kepler.gl/tree/master/examples [react-palm]: https://github.com/btford/react-palm [roadmap]: https://github.com/keplergl/kepler.gl/wiki/Kepler.gl-2019-Roadmap [stack]: https://stackoverflow.com/questions/tagged/kepler.gl [web]: http://www.kepler.gl/ [vis-academy]: http://vis.academy/#/kepler.gl/ [user-guide]: docs/user-guides/README.md [user-guide-jupyter]: docs/keplergl-jupyter/README.md [api-reference]: docs/api-reference/README.md [get-started]: ./docs/api-reference/get-started.md [reducers]: docs/api-reference/reducers/README.md [components]: docs/api-reference/components/README.md [custom-theme]: docs/api-reference/custom-theme/README.md [reducers]: docs/api-reference/reducers/README.md [actions-updaters]: docs/api-reference/actions/README.md [processors]: docs/api-reference/processors/README.md [schemas]: docs/api-reference/schemas/README.md [using-updaters]: ./docs/api-reference/advanced-usages/using-updaters.md [custom-map-styles]: ./docs/api-reference/advanced-usages/custom-map-styles.md [forward-actions]: ./docs/api-reference/advanced-usages/forward-actions.md [replace-ui-component]: ./docs/api-reference/advanced-usages/replace-ui-component.md [saving-loading-w-schema]: ./docs/api-reference/advanced-usages/saving-loading-w-schema.md [localization]: ./docs/api-reference/localization/README.md [40]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object [41]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array [42]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String [43]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean [44]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number [45]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号