UNPKG

imobile_for_reactnative

Version:

iMobile for ReactNative,是SuperMap iMobile推出的一款基于React-Native框架的移动应用开发工具。基于该开发工具,用户可以使用JavaScript开发语言,开发出在Android和IOS操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。

889 lines (729 loc) 22.3 kB
import GeoStyle from 'imobile_for_reactnative/NativeModule/GeoStyle' import { NativeModules, NativeEventEmitter, EmitterSubscription } from 'react-native' import { EventConst } from '../../constains/index' import { FieldInfo, Geometry, Point2D, Point3D, Rectangle2D, IGeometryType, Geometry3D, GeometryType } from '../data/SData' const SScene = NativeModules.SScene const event = new NativeEventEmitter(SScene) //*********************************** type 定义 ********************************************/ /** 3维场景Action */ export interface Action3D { /** 空操作 */ NULL: 0, /** 平移 */ PAN3D: 1, /** 测量距离 */ MEASUREDISTANCE3D: 31, /** 测量面积 */ MEASUREAREA3D: 32, /** 测量高度 */ MEASUREALTITUDE3D: 33, /** 平移且可以选择 */ PANSELECT3D: 105, /** 画线 */ CREATEPOINT3D: 106, /** 画线 */ CREATELINE3D: 107, /** 画多线 */ CREATEPOLYLINE3D: 108, /** 画3维对象 */ CREATEPOLYGON3D: 109, } /** 3维图层类型 */ export interface Layer3DType { /** 影像文件缓存。 */ IMAGEFILE: 1, /** KML类型三维图层 */ KML: 2, /** @deprecated */ VECTORFILE: 10, /** OSGB图层 */ OSGBFILE: 15, WMS: 11, /** WMTS服务 */ WMTS: 12, DYNAMICMODEL: 20, /** 在线BingMaps */ l3dBingMaps: 22, l3dGoogleMaps: 23, OPENSTREETMAPS: 24, } export type TAction3D = Action3D[keyof Action3D] export type TLayer3DType = Layer3DType[keyof Layer3DType] /** 3维图层 */ export interface Layer3D { /** 图层名 */ name: string /** 图层显示名 */ caption: string /** 图层是否可见 */ isVisible: boolean /** 图层是否可选 */ isSelectable: boolean /** 图层类型 */ type: TLayer3DType } /** 3维地形图层 */ export interface TerrainLayer { /** 图层名 */ name: string /** 图层显示名 */ caption: string /** 图层是否可见 */ isVisible: boolean } /** * 三维场景窗口跟踪结束事件参数类 * 该类主要为三维场景窗口中的跟踪结束事件,即为SceneControl类的 Tracked事件提供数据 */ export interface Tracking3DEvent { /** 点击事件在3维场景中的 x 坐标 */ x: number /** 点击事件在3维场景中的 y 坐标 */ y: number /** 点击事件在3维场景中的 z 坐标 */ z: number /** 当前量算对象的长度 */ currentLength: number /** * 当前量算对象的高度 * @platform android */ currentHeight?: number /** * 当前量算对象的角度 * @platform android */ currentAngle?: number /** 量算时的总面积 */ totalArea: number /** 量算时的总长度 */ totalLength: number } interface RGB { r: number g: number b: number } /** 3维几何风格 */ export interface GeoStyle3D { fillForeColor: RGB lineColor: RGB lineWidth: number markerColor: RGB markerScale: number /** * marker文件路径 * 若是 app 内置资源,使用 APP:// 开头 */ markerFile: string /** 高度模式 */ altitudeMode: AltitudeMode[keyof AltitudeMode] } /** * 枚举定义了高度模式类型常量,高度模式用于指示 SuperMap 组件产品解析三维数据海拔高度值的方式。 */ export interface AltitudeMode { /** 贴地表模式, 所有对象的Z值不起作用 */ CLAMP_TO_GROUND: 0, /** 相对地表模式, Z值是指相对于地形的高度 */ RELATIVE_TO_GROUND: 1, /** 绝对海拔模式, 海拔高度 */ ABSOLUTE: 2, /** * 相对地下的模式 * @platform android */ RELATIVE_TO_UNDERGROUND: 3, /** * 地下绝对高度模式 * @platform android */ ABSOLUTE_UNDER_GROUND: 4, } /** 网络服务图片设置 */ export interface OnlineImageOption { /** 网络服务图片格式 */ imageFormatType: ImageFormatType dpi: number } /** 网络服务图片格式 */ export interface IImageFormatType { NONE: 0, PNG: 123, JPG: 122, GIF: 124, JPG_PNG: 147, DXTZ: 126, BMP: 121, } /** 网络服务图片格式 */ export type ImageFormatType = IImageFormatType[keyof IImageFormatType] /** 场景类型 */ export interface ISceneType { /** 球三维 */ EARTH_SPHERICAL: 0 /** 平面三维 */ NONEARTH: 2 } /** 场景类型 */ export type SceneType = ISceneType[keyof ISceneType] //*********************************** 枚举常量 ********************************************/ export const Action3D: Action3D = { NULL: 0, PAN3D: 1, MEASUREDISTANCE3D: 31, MEASUREAREA3D: 32, MEASUREALTITUDE3D: 33, PANSELECT3D: 105, CREATEPOINT3D: 106, CREATELINE3D: 107, CREATEPOLYLINE3D: 108, CREATEPOLYGON3D: 109, } export const Layer3DType: Layer3DType = { IMAGEFILE: 1, KML: 2, VECTORFILE: 10, OSGBFILE: 15, WMS: 11, WMTS: 12, DYNAMICMODEL: 20, l3dBingMaps: 22, l3dGoogleMaps: 23, OPENSTREETMAPS: 24, } export const AltitudeMode: AltitudeMode = { CLAMP_TO_GROUND: 0, RELATIVE_TO_GROUND: 1, ABSOLUTE: 2, RELATIVE_TO_UNDERGROUND: 3, ABSOLUTE_UNDER_GROUND: 4, } export const ImageFormatType: IImageFormatType = { NONE: 0, PNG: 123, JPG: 122, GIF: 124, JPG_PNG: 147, DXTZ: 126, BMP: 121, } export const SceneType: ISceneType ={ EARTH_SPHERICAL: 0, NONEARTH: 2, } //***********************************事件监听回调********************************************/ let traking3dListener: EmitterSubscription | undefined let singleTapListener: EmitterSubscription | undefined let longPressTapListener: EmitterSubscription | undefined let feature3DSelectListener: EmitterSubscription | undefined /** * 用于接收三维场景窗口的跟踪图层中交互绘制结束事件的监听器。 * 在三维场景窗口的跟踪图层中绘制几何对象结束时调用。 * @param listener */ export function setTracking3DListener(listener?: (event: Tracking3DEvent) => void): void { traking3dListener?.remove() traking3dListener = listener && event.addListener(EventConst.SCENE_TRACKING_EVENT, listener) } /** 3维场景手势监听回调 */ interface Gesture3DListener { /** 点击回调,返回屏幕像素坐标 */ onSingleTap: (event: {x: number, y: number}) => void /** 长按回调,返回屏幕像素坐标 */ onLongPress: (event: {x: number, y: number}) => void } /** * 设置场景手势监听回调 * @param listener */ export function setGestureListener(listener?: Gesture3DListener): void { singleTapListener?.remove() longPressTapListener?.remove() singleTapListener = listener?.onSingleTap && event.addListener(EventConst.SCENE_GESTURE_SINGLE_TAP, listener.onSingleTap) longPressTapListener = listener?.onLongPress && event.addListener(EventConst.SCENE_GESTURE_LONG_PRESS, listener.onLongPress) } /** * 设置对象选择回调 * @param listener 回调返回对象所在图层名 */ export function setFeature3DSelectListener(listener?: (layerName: string) => void): void { feature3DSelectListener?.remove() feature3DSelectListener = listener && event.addListener(EventConst.SCENE_SELECT_FEATURE3D, listener) } //***********************************数据操作******************************************** /** * 打开场景 * @param sceneName 导入后的场景名(pxp文件名,不含 .pxp 部分) * @returns 成功返回 true,失败返回 false */ export function openScene(sceneName: string): Promise<boolean>{ return SScene.openScene(sceneName) } /** * 打开iserver发布的在线场景 * @param url 场景url。eg: http://192.168.1.100:8090/iserver/services/3D-workspaceName/rest/realspace/scenes/sceneName * @returns 成功返回 true,失败返回 false */ export function openOnlineScene(url: string): Promise<boolean> { return SScene.openOnlineScene(url) } /** * 关闭工作空间及地图控件, 退出时调用 * @returns 成功返回 true,失败返回 false */ export function exitScene(): Promise<boolean> { return SScene.exitScene() } //***********************************场景设置******************************************** /** * 获取场景类型 * @returns 当前场景类型 */ export function getSceneType(): Promise<SceneType> { return SScene.getSceneType() } /** * 屏幕像素点转三维场景点 * * @param pixelPoint 屏幕像素点 * @param pixelToGlobeMode 求交模式。 0: 地形和模型都参与求交点,返回距离视点最近的交点; 1:只与地形求交点 * @returns 三维场景点 */ export function pixelToGlobe(pixelPoint: Point2D, pixelToGlobeMode: 0 | 1): Promise<Point3D|null> { return SScene.pixelToGlobe(pixelPoint, pixelToGlobeMode) } /** * 获取场景相机当前经纬度 * @return 当前相机在场景中的位置 */ export function getCameraLocation(): Promise<Point3D|null> { return SScene.getCameraLocation() } /** * 设置相机的方位角(上方向,即和北方的夹角),方位角的范围是0-360度。 */ export function setCameraHeading(degree: number): Promise<boolean> { return SScene.setCameraHeading(degree) } /** * 获取相机方位角,即与北方的夹角(0 - 360度) * @returns 相机方位角 */ export function getCameraHeading(): Promise<number> { return SScene.getCameraHeading() } /** * 设置三维场景操作类型 * @param action3d 操作类型 */ export function setAction(action3d: TAction3D): Promise<boolean> { return SScene.setAction(action3d) } /** * 飞行到指定地点 * @param point 指定点经纬度及高度 * @param duration 飞行事件,单位毫秒 */ export function flyToPoint(point: Point3D, duration: number): Promise<boolean> { return SScene.flyToPoint(point, duration) } /** * 围绕指定地点旋转飞行,飞行过程中可以控制飞行的速度。 * @param point 环绕点 * @param speedRation 基准飞行速度的倍数,默认为1 */ export function flyCircle(point: Point3D, speedRatio: number): Promise<boolean> { return SScene.flyCircle(point, speedRatio) } /** * 根据给定的缩放比例,对三维地图场景进行缩放操作。 * 缩放比例的范围为负无穷大到1。当参数为(0,1)之间的数值时,场景按比例放大;参数值小于0时,场景按比例缩小,但缩小到一定程度后将不会再缩小。 * @param 指定的缩放比例数值 */ export function zoom(ratio: number): Promise<boolean> { return SScene.zoom(ratio) } /** * 设置场景要显示的范围 * @param rec 要显示的范围 */ export function ensureVisible(bounds: Rectangle2D): Promise<boolean> { return SScene.ensureVisible(bounds) } /** 设置导航条是否可见 */ export function setNavigationControlVisible(visible: boolean): Promise<boolean> { return SScene.setNavigationControlVisible(visible) } /** * 设置测量的线或面的点串,设置后将会更新测量事件 * @param 线或面的点串 * @returns */ export function updateMeasureGeometryPoints(points: Point3D[]): Promise<boolean> { return SScene.updateMeasureGeometryPoints(points) } //************************************** 3维图层 ********************************************************/ /** * 获取当前场景的所有3D图层 * @returns 当前场景3维图层集合 */ export function getLayers(): Promise<Layer3D[]> { return SScene.getLayers() } /** * 设置3D图层的可见性 * @param layerName 3D图层名 * @param visible 是否可见 */ export function setLayerVisible(layerName: string, visible: boolean): Promise<boolean> { return SScene.setLayerVisible(layerName, visible) } /** * 设置3D图层的可选 * @param layerName 3D图层名 * @param visible 是否可选 */ export function setLayerSelectable(layerName: string, selectable: boolean): Promise<boolean> { return SScene.setLayerSelectable(layerName, selectable) } /** * 获取可用的图层名 * @param layerName 期望使用的图层名 * @returns 可用的图层名 */ export function getAvailableLayerName(layerName: string): Promise<boolean> { return SScene.getAvailableLayerName(layerName) } /** * 添加图层 * @param path 图层资源本地绝对路径或 iSerrver 在线路径 * @param layerType 图层类型 * @param layerName 要添加的图层名 * @param addToHead 是否添加到最上层 */ export function addLayer(path: string, layerType: TLayer3DType, layerName: string, addToHead: boolean): Promise<boolean> /** * 添加在线天地图服务 * @param url 天地图服务地址 * @param layerType 图层类型 * @param layerName 要添加的图层名 * @param addToHead 是否添加到最上层 * @param imageOption 在线服务图片设置 */ export function addLayer(url: string, layerType: TLayer3DType, layerName: string, addToHead: boolean, imageOption: OnlineImageOption): Promise<boolean> //addLayer 实现 export function addLayer(path: string, layerType: TLayer3DType, layerName: string, addToHead: boolean, imageOption?: OnlineImageOption): Promise<boolean> { return SScene.addLayer(path, layerType, layerName, addToHead, imageOption) } /** * 移除3D图层 * @param layerName 3D图层名 */ export function removeLayer(layerName: string): Promise<boolean> { return SScene.removeLayer(layerName) } /** * 保存三维图层中的 features 到指定 kml 文件中 * @param layerName 要保存的图层改名 * @param path 要保存的 kml 绝对路径 * @throws 许可异常 */ export function saveLayerAsKml(layerName: string, path: string): Promise<boolean> { return SScene.saveLayerAsKml(layerName, path) } //************************************** 地形图层 ********************************************************/ /** * 获取当前场景的所有地形图层 * @returns 当前场景地形图层集合 */ export function getTerrainLayers(): Promise<TerrainLayer[]> { return SScene.getTerrainLayers() } /** * 设置地形图层的可见性 * @param layerName 地形图层名 * @param visible 是否可见 */ export function setTerrainLayerVisible(layerName: string, visible: boolean): Promise<boolean> { return SScene.setTerrainLayerVisible(layerName, visible) } /** * 获取可用的地形图层名 * @param layerName 期望使用的图层名 * @returns 可用的地形图层名 */ export function getAvailableTerrainLayerName(layerName: string): Promise<boolean> { return SScene.getAvailableTerrainLayerName(layerName) } /** * 添加地形图层 * @param path 地形图层资源本地绝对路径或在线路径 * @param layerName 要添加的图层名 * @param addToHead 是否添加到最上层,只对本地图层有效 * @param password 指定路径的大文件密码,只对本地图层有效 */ export function addTerrainLayer(path: string, layerName: string, addToHead = true, password = ''): Promise<boolean> { return SScene.addTerrainLayer(path, layerName, addToHead, password) } /** * 移除地形图层 * @param layerName 地形图层名 */ export function removeTerrainLayer(layerName: string): Promise<boolean> { return SScene.removeTerrainLayer(layerName) } interface Cache { name: string path: string } /** * 获取当前工作空间目录terrain目录下的地形缓存文件 * @deprecated todo 重构资源保存逻辑 */ export function getTerrainCache(): Promise<Cache[]> { return SScene.getTerrainCache() } /** * 添加在线地形缓存url到当前工作空间目录terrain目录下 * @deprecated todo 重构资源保存逻辑 */ export function addOnlineTerrainCache(url: string): Promise<boolean> { return SScene.addOnlineTerrainCache(url) } /** * 获取当前工作空间目录Image目录下的影像缓存文件 * @deprecated todo 重构资源保存逻辑 */ export function getImageCache(): Promise<Cache[]> { return SScene.getImageCache() } /** * 添加在线影像缓存url到当前工作空间目录terrain目录下 * @deprecated todo 重构资源保存逻辑 */ export function addOnlineImageCache(url: string): Promise<boolean> { return SScene.addOnlineImageCache(url) } /** * 清除所有图层的选择集 */ export function clearSelection(): Promise<boolean> { return SScene.clearSelection() } /** * 获取指定图层的显示范围 * @param layerName 要指定的图层名 * @returns 指定图层的显示范围 */ export function getLayerBounds(layerName: string): Promise<Rectangle2D | null | undefined> { return SScene.getLayerBounds(layerName) } //************************************** 添加对象 ********************************************************/ /** * 添加3维几何对象到三维图层上 * @param geo3D 3维几何对象 * @param style 3维几何风格 */ export function addGeometryToLayer(layerName: string, geo3D: Geometry3D, style?: Partial<GeoStyle3D>): Promise<boolean> { if(geo3D.type === GeometryType.GEOPLACEMARK) { if(geo3D.geometryStyle && !_is3DGeometry(geo3D.geometry.type)) { geo3D.geometryStyle = JSON.stringify(geo3D.geometryStyle) as any } } return SScene.addGeometryToLayer(layerName, geo3D, style) } //************************************** tracking Layer ********************************************************/ /** * 添加2维几何对象到场景跟踪层上 * @param geo2d 2维几何对象 * @param tag tag名 * @param style 2维几何风格 */ export function addGeometryToTrackingLayer(geo2d: Geometry, tag: string, style?: GeoStyle): Promise<boolean> /** * 添加3维几何对象到场景跟踪层上 * @param geo3D 3维几何对象 * @param tag tag名 * @param style 3维几何风格 */ export function addGeometryToTrackingLayer(geo3D: Geometry3D, tag: string, style?: Partial<GeoStyle3D>): Promise<boolean> /** 添加对象到跟踪层方法实现 */ export function addGeometryToTrackingLayer(geo: Geometry3D | Geometry, tag: string, style?: Partial<GeoStyle3D> | GeoStyle): Promise<boolean> { // 将Geostyle转为string const is3D = _is3DGeometry(geo.type) const style3d = is3D ? style : undefined const style2d = is3D ? undefined : JSON.stringify(style) if(geo.type === GeometryType.GEOPLACEMARK) { if(geo.geometryStyle && !_is3DGeometry(geo.geometry.type)) { geo.geometryStyle = JSON.stringify(geo.geometryStyle) as any } } return SScene.addGeometryToTrackingLayer(geo, tag, style3d, style2d) } function _is3DGeometry(type: IGeometryType[keyof IGeometryType]): boolean { return (type === GeometryType.GEOPOINT3D || type === GeometryType.GEOLINE3D || type === GeometryType.GEOREGION3D || type === GeometryType.GEOPLACEMARK ) } /** * 根据tag名从跟踪层上移除对象 * @param tag 要移除对象的tag名 */ export function removeGeometryFromTrackingLayer(tag: string): Promise<boolean> { return SScene.removeGeometryFromTrackingLayer(tag) } /** * 移除跟踪层所有对象 */ export function clearTrackingLayer(): Promise<boolean> { return SScene.clearTrackingLayer() } //***********************************属性查询******************************************** /** 三维图层的field值 */ export interface FieldValue3D { /** 字段名 */ name: string /** 字段值 */ value: string } /** * 获取指定图层的 fieldinfo * @param layerName 图层名 * @returns 指定图层的 fieldinfo */ export function getFieldInfos(layerName: string): Promise<FieldInfo[]> { return SScene.getFieldInfos(layerName) } /** * 获取OSGB缓存图层({@link Layer3DType[OSGBFILE]})选中对象的属性值信息 * @param layerName OSGB 缓存图层 * @returns 选中对象的属性值信息 */ export function getFieldValueOfSelectedObject(layerName: string): Promise<FieldValue3D[]> { return SScene.getFieldValueOfSelectedObject(layerName) } //***********************************飞行******************************************** /** 获取飞行路径列表 */ export function getFlyRouteNames(): Promise<{title: string, index: number}[]> { return SScene.getFlyRouteNames() } /** * 设置当前的飞行路径 * @param index 飞行路径的id */ export function setFlyRoute(index: number): Promise<boolean> { return SScene.setFlyRoute(index) } /** 开始飞行 */ export function startFly(): Promise<boolean> { return SScene.startFly() } /** 暂停飞行 */ export function pauseFly(): Promise<boolean> { return SScene.pauseFly() } /** 停止飞行 */ export function stopFly(): Promise<boolean> { return SScene.stopFly() } //***********************************飞行站点编辑******************************************** /** * 添加飞行站点 */ export function addRouteStop(): Promise<boolean> { return SScene.addRouteStop() } /** * 保存站点并飞行 * @throws 许可异常 */ export function saveRouteStop(): Promise<boolean> { return SScene.saveRouteStop() } /** * 暂停站点飞行 * @deprecated 使用 pauseFly */ export function pauseRouteStop(): Promise<boolean> { return SScene.pauseRouteStop() } /** 清除所有编辑的站点 */ export function clearRouteStops(): Promise<boolean> { return SScene.clearRouteStops() } //***********************************box 裁剪******************************************** interface ClipParam1 extends ClipCommon{ /** 底面长 */ width: number /** 底面宽 */ height: number /** 高度 */ length: number /** 中心点x坐标 */ X: number /** 中心点y坐标 */ Y: number /** 中心点z坐标 */ Z: number /** z旋转 */ zRot: number } interface ClipParam2 extends ClipCommon{ /** 起点x坐标 */ startX: number /** 起点y坐标 */ startY: number /** 终点x坐标 */ endX: number /** 终点y坐标 */ endY: number } interface ClipCommon { /** 裁剪位置 true 裁剪内部 false 裁剪外部 */ clipInner: boolean isCliped: boolean /** 参加裁剪的图层 */ layers: { name: string selected: boolean }[] } /** * box裁剪 * @throws 许可异常 */ export function clipByBox(param: ClipParam1 | ClipParam2): Promise<{ /** 底面长 */ width: number /** 底面宽 */ height: number /** 高度 */ length: number /** z旋转 */ zRot: number /** 中心点x坐标 */ X: number /** 中心点y坐标 */ Y: number /** 中心点z坐标 */ Z: number /** 裁剪位置 true 裁剪内部 false 裁剪外部 */ clipInner: boolean } | undefined> { return SScene.clipByBox(param) } /** * 清除裁剪 */ export function clearClip(): Promise<boolean> { return SScene.clearClip() }