imobile_for_reactnative
Version:
iMobile for ReactNative,是SuperMap iMobile推出的一款基于React-Native框架的移动应用开发工具。基于该开发工具,用户可以使用JavaScript开发语言,开发出在Android和IOS操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。
159 lines (146 loc) • 5.25 kB
text/typescript
/**
* 在线分析
* Author: ysl
*/
import {
NativeModules,
NativeEventEmitter,
EmitterSubscription,
} from 'react-native'
import { EventConst } from '../../constains/index'
const Analyst = NativeModules.SOnlineAnalyst
const nativeEvt = new NativeEventEmitter(Analyst)
/** 面积单位 */
export type AreaUnit = 'SquareMile' // 平方英尺
| 'SquareMeter' // 平方米
| 'SquareKiloMeter' // 平方千米
| 'Hectare' // 公顷
| 'Are' // 公亩
| 'Acre' // 英亩
| 'SquareFoot' // 平方尺
| 'SquareYard' // 平方码
/** 长度单位 */
export type Unit = 'Meter' // 米
| 'Kilometer' // 千米
| 'Yard' // 码
| 'Foot' // 英尺
| 'Mile' // 英里
/** 颜色渐变类型 */
export type ColorGradientType = 'GREENORANGEVIOLET' // 绿橙紫渐变色
| 'GREENORANGERED' // 绿橙红渐变
| 'RAINBOW' // 彩虹色
| 'SPECTRUM' // 光谱渐变
| 'TERRAIN' // 地形渐变
/** 在线分析参数 */
export interface AnalysisDataType {
datasetName: string,
/**
* 设置分析方法
* 0:简单点密度分析,1:核密度分析
*/
analystMethod: 0 | 1,
/**
* 设置网格面类型
* 0:四边形网格,1:六边形网格
*/
meshType: 0 | 1,
/** 设置网格大小 */
meshSize: number,
/** 设置半径 */
radius: number,
/** 设置权重值 */
weight?: number,
/**
* 设置面积单位 SquareMile(默认)
*/
areaUnit?: AreaUnit,
/**
* 设置网格大小单位 Meter(默认)
*/
meshSizeUnit?: Unit,
/**
* 设置搜索半径单位 Meter(默认)
*/
radiusUnit?: Unit,
/**
* 设置缓存范围[left, bottom, right, top]
*/
bounds?: number[],
/** 专题图分段参数(选填) */
rangeCount?: number,
/** 专题图颜色渐变模式--默认为GREENORANGEVIOLET(绿橙紫) 可选GREENORANGERED(绿橙红),RAINBOW(彩虹),SPECTRUM(光谱),TERRAIN(地形) */
colorGradientType?: ColorGradientType,
}
/** 在线分析连接信息 */
export interface AnalysisOnlineParameter {
ip: string,
port: string,
userName: string,
password: string,
}
/** 在线分析监听返回类型 */
export interface OnlineAnalystListenerResponse{
result: boolean,
/** 数据源名称数组 */
datasources?: string[],
error?: string,
}
/*********************************************** 在线分析 *************************************************/
let onlineAnalystListener: EmitterSubscription | null
let onlineAnalystHandler: ((e: OnlineAnalystListenerResponse) => void) | null
/**
* 设置在线协作监听
* @param handler 监听回调
*/
export function setOnlineAnalystListener(handler: (e: OnlineAnalystListenerResponse) => void) {
onlineAnalystHandler = handler
onlineAnalystListener?.remove()
onlineAnalystListener = nativeEvt.addListener(EventConst.ONLINE_ANALYST_RESULT, function (e: OnlineAnalystListenerResponse) {
if (onlineAnalystHandler && typeof onlineAnalystHandler === 'function') {
onlineAnalystHandler(e)
removeOnlineAnalystListener()
}
})
}
/** 移除在线分析监听 */
export function removeOnlineAnalystListener() {
onlineAnalystHandler = null
if (onlineAnalystListener) {
onlineAnalystListener.remove()
onlineAnalystListener = null
}
}
/**
* 获取在线分析数据
* @param ip 在线分析IP
* @param port 在线分析端口
* @param type 获取数据类型 0:源数据 1:密度数据集数据 2:点聚合数据集数据
* @returns 在线分析数据
*/
export async function getOnlineAnalysisData(ip: string, port: string, type = 0): Promise<string> {
if (!ip || !port) return ''
const data = await Analyst.getOnlineAnalysisData(ip, port, type)
return JSON.parse(data)
}
/**
* 在线分析-密度分析
* @param serverData 密度分析连接信息对象
* @param analysisData 密度分析参数对象
* @param handler 密度分析监听事件
* @returns 分析成功返回true,否则返回false
*/
export async function densityOnline(serverData: AnalysisOnlineParameter, analysisData: AnalysisDataType, handler: (e: OnlineAnalystListenerResponse) => void): Promise<boolean> {
setOnlineAnalystListener(handler)
return Analyst.densityOnline(serverData, analysisData)
}
/**
* 在线分析-点聚合分析
* @param serverData 点聚合分析连接信息对象
* @param analysisData 点聚合分析参数对象
* @param handler 点聚合分析监听事件
* @returns 分析成功返回true,否则返回false
*/
export async function aggregatePointsOnline(serverData: AnalysisOnlineParameter, analysisData: AnalysisDataType, handler: (e: OnlineAnalystListenerResponse) => void): Promise<boolean> {
setOnlineAnalystListener(handler)
return Analyst.aggregatePointsOnline(serverData, analysisData)
}