imobile_for_reactnative
Version:
iMobile for ReactNative,是SuperMap iMobile推出的一款基于React-Native框架的移动应用开发工具。基于该开发工具,用户可以使用JavaScript开发语言,开发出在Android和IOS操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。
889 lines (729 loc) • 22.3 kB
text/typescript
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()
}