rn_supermap
Version:
rn_supermap 一款基于React-Native框架的移动应用开发工具。基于该开发工具,用户可以使用JavaScript开发语言,开发出在Android和IOS操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。
1,188 lines (1,109 loc) • 36.1 kB
JavaScript
/*********************************************************************************
Copyright © SuperMap. All rights reserved.
Author: Will
E-mail: pridehao@gmail.com
**********************************************************************************/
const LONGPRESS_EVENT = "com.supermap.RN.Mapcontrol.long_press_event";
import { NativeModules, DeviceEventEmitter, NativeEventEmitter, Platform, Dimensions } from 'react-native';
let MC = NativeModules.JSMapControl;
import Map from './Map.js';
import Navigation2 from './IndustryNavi.js';
import TraditionalNavi from './TraditionalNavi';
import GeoPoint from './GeoPoint.js';
import GeoRegion from './GeoRegion.js';
import GeoLine from './GeoLine.js';
import Geometry from './Geometry.js';
import Layer from './Layer.js';
import Collector from './Collector';
const nativeEvt = new NativeEventEmitter(MC);
/**
* @class MapControl
* @property {object} ACTION - PAN:地图漫游。
VERTEXADD:在可编辑图层中为对象添加节点。
VERTEXDELETE:在可编辑图层中为对象删除节点。
SELECT:在对象上点击,选择对象。
VERTEXEDIT:在可编辑图层中编辑对象的节点。
CREATEPOINT:在可编辑图层上点击式绘点。
CREATEPOLYLINE:在可编辑图层中点击式绘直线。
CREATEPOLYGON:在可编辑图层中点击式绘多边形。
ERASE_REGION // 擦除面对象
SPLIT_BY_LINE // 使用线切分
UNION_REGION // 面与面合并
COMPOSE_REGION // 面与面组合
PATCH_HOLLOW_REGION // 切割岛洞多边形
INTERSECT_REGION // 填充导洞对象
FILL_HOLLOW_REGION // 求交面对象
PATCH_POSOTIONAL_REGION // 多对象补洞
MOVE_COMMON_NODE // 公共点编辑(协调编辑)
CREATE_POSITIONAL_REGION // 公共边构面
SPLIT_BY_DRAWLINE // 面被线分割(手绘式)
DRAWREGION_HOLLOW_REGION // 手绘岛洞面(手绘式)
DRAWREGION_ERASE_REGION // 面被面擦除(手绘式)
SPLIT_BY_DRAWREGION // 面被面分割(手绘式)
MOVE_GEOMETRY // 平移对象
MULTI_SELECT // 多选对象
SWIPE // 卷帘模式
*/
export default class MapControl {
/**
* 返回在地图控件中显示的地图对象。
* @memberOf MapControl
* @returns {Promise.<Map>}
*/
async getMap() {
try {
var { mapId } = await MC.getMap(this._SMMapControlId);
var map = new Map();
map._SMMapId = mapId;
return map;
} catch (e) {
console.error(e);
}
}
/**
* 设置地图控件中地图的当前操作状态。
* @memberOf MapControl
* @param {number} actionType
* @returns {Promise.<void>}
*/
async setAction(actionType) {
try {
console.log(actionType)
await MC.setAction(this._SMMapControlId, actionType);
} catch (e) {
console.error(e);
}
}
/**
* 提交操作,对于采集而言,该接口将把采集的新几何对象写入到数据集,对于编辑,则是更新数据集中的正在编辑的对象。
* @memberOf MapControl
* @returns {Promise.<Promise|*|{phasedRegistrationNames}>}
*/
async submit() {
try {
var submited = await MC.submit(this._SMMapControlId);
return submited;
} catch (e) {
console.error(e);
}
}
/**
* 监听编辑行为的变更事件(deprecated)
* @memberOf MapControl
* @param {function} actionChange 编辑行为变更函数,回调事件参数:e:newAction,e:oldAction
*/
/*
async addActionChangedListener(actionChange){
try{
DeviceEventEmitter.addListener('ActionChange', function(e) {
actionChange && actionChange(e);
});
if(typeof actionChange == "function"){
await MC.addActionChangedListener(this.mapControlId);
}else{
throw new Error("addActionChangedListener need a callback function as first argument!");
}
}catch (e){
console.error(e);
}
}
*/
/**
* 移除动作变更监听器。(deprecated)
* @memberOf MapControl
* @returns {Promise.<void>}
*/
/*
async removeActionChangedListener(actionChange){
try{
await MC.removeActionChangedListener(this._SMMapControlId);
}catch (e){
console.error(e);
}
}
*/
/**
* 手势监听
* @memberOf MapControl
* @param {object} events - 传入一个对象作为参数,该对象可以包含两个属性:longPressHandler和scrollHandler。两个属性的值均为function类型,分部作为长按与滚动监听事件的处理函数。
* @returns {Promise.<void>}
*/
async setGestureDetector(handlers) {
try {
if (handlers) {
await MC.setGestureDetector(this._SMMapControlId);
} else {
throw new Error("setGestureDetector need callback functions as first two argument!");
}
//差异化
if (Platform.OS === 'ios') {
if (typeof handlers.longPressHandler === "function") {
nativeEvt.addListener("com.supermap.RN.Mapcontrol.long_press_event", function (e) {
// longPressHandler && longPressHandler(e);
handlers.longPressHandler(e);
});
}
if (typeof handlers.singleTapHandler === "function") {
nativeEvt.addListener("com.supermap.RN.Mapcontrol.single_tap_event", function (e) {
handlers.singleTapHandler(e);
});
}
if (typeof handlers.doubleTapHandler === "function") {
nativeEvt.addListener("com.supermap.RN.Mapcontrol.double_tap_event", function (e) {
handlers.doubleTapHandler(e);
});
}
if (typeof handlers.touchBeganHandler === "function") {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.touch_began_event', function (e) {
handlers.touchBeganHandler(e);
});
}
if (typeof handlers.touchEndHandler === "function") {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.touch_end_event', function (e) {
handlers.touchEndHandler(e);
});
}
if (typeof handlers.scrollHandler === "function") {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.scroll_event', function (e) {
handlers.scrollHandler(e);
});
}
} else {
if (typeof handlers.longPressHandler === "function") {
DeviceEventEmitter.addListener("com.supermap.RN.Mapcontrol.long_press_event", function (e) {
// longPressHandler && longPressHandler(e);
handlers.longPressHandler(e);
});
}
if (typeof handlers.singleTapHandler === "function") {
DeviceEventEmitter.addListener("com.supermap.RN.Mapcontrol.single_tap_event", function (e) {
handlers.singleTapHandler(e);
});
}
if (typeof handlers.doubleTapHandler === "function") {
DeviceEventEmitter.addListener("com.supermap.RN.Mapcontrol.double_tap_event", function (e) {
handlers.doubleTapHandler(e);
});
}
if (typeof handlers.touchBeganHandler === "function") {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.touch_began_event', function (e) {
handlers.touchBeganHandler(e);
});
}
if (typeof handlers.touchEndHandler === "function") {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.touch_end_event', function (e) {
handlers.touchEndHandler(e);
});
}
if (typeof handlers.scrollHandler === "function") {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.scroll_event', function (e) {
handlers.scrollHandler(e);
});
}
}
} catch (e) {
console.error(e);
}
}
/**
* 移除手势监听
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async deleteGestureDetector() {
try {
await MC.deleteGestureDetector(this._SMMapControlId)
} catch (e) {
console.error(e);
}
}
/**
* 监听地图参数变化,分别由边界变化sizeChanged,比例尺变化scaleChanged,角度变化angleChanged,中心点变化boundsChanged(iOS目前只支持比例尺变化监听与中心点变化监听)。
* @memberOf MapControl
* @param events 该对象有下面四个函数类型的属性分别处理四种监听事件
* {boundsChanged,scaleChanged,angleChanged,sizeChanged}
*/
async setMapParamChangedListener(events) {
try {
boundsChanged = events.boundsChanged;
scaleChanged = events.scaleChanged;
angleChanged = events.angleChanged;
sizeChanged = events.sizeChanged;
var success = await MC.setMapParamChangedListener(this._SMMapControlId);
console.debug("Listening map parameters changed.");
if (!success) return;
//差异化处理
if (Platform.OS === 'ios') {
nativeEvt.addListener('Supermap.MapControl.MapParamChanged.BoundsChanged', function (e) {
if (typeof boundsChanged == 'function') {
events.boundsChanged(e);
} else {
console.error("Please set a callback to the property 'boundsChanged' in the first argument.");
}
});
nativeEvt.addListener('Supermap.MapControl.MapParamChanged.ScaleChanged', function (e) {
if (typeof events.scaleChanged == 'function') {
events.scaleChanged(e);
} else {
console.error("Please set a callback to the property 'scaleChanged' in the first argument.");
}
});
return
}
DeviceEventEmitter.addListener('Supermap.MapControl.MapParamChanged.BoundsChanged', function (e) {
if (typeof boundsChanged == 'function') {
events.boundsChanged(e);
} else {
console.error("Please set a callback to the property 'boundsChanged' in the first argument.");
}
});
DeviceEventEmitter.addListener('Supermap.MapControl.MapParamChanged.ScaleChanged', function (e) {
if (typeof events.scaleChanged == 'function') {
events.scaleChanged(e);
} else {
console.error("Please set a callback to the property 'scaleChanged' in the first argument.");
}
});
DeviceEventEmitter.addListener('Supermap.MapControl.MapParamChanged.AngleChanged', function (e) {
if (typeof events.angleChanged == 'function') {
events.angleChanged(e);
} else {
console.error("Please set a callback to the property 'angleChanged' in the first argument.");
}
});
DeviceEventEmitter.addListener('Supermap.MapControl.MapParamChanged.SizeChanged', function (e) {
if (typeof events.sizeChanged == 'function') {
events.sizeChanged(e);
} else {
console.error("Please set a callback to the property 'sizeChanged' in the first argument.");
}
});
} catch (e) {
console.error(e);
}
}
/**
* 地图刷新监听器(deprecated)
* @memberOf MapControl
* @param {function} callback - 刷新处理回调函数
* @returns {Promise.<void>}
*/
async setRefreshListener(callback) {
try {
var success = await MC.setRefreshListener(this._SMMapControlId);
console.log("MapControl:test result:", success);
if (success) {
DeviceEventEmitter.addListener("com.supermap.RN.Mapcontrol.refresh_event", function (e) {
// console.log("MapControl:监听到地图刷新");
if (typeof callback === 'function') {
callback(e);
} else {
console.error("Please set a callback function as the first argument.");
}
});
}
} catch (e) {
console.error(e);
}
}
/**
* 获得当前Geometry几何对象
* @memberOf MapControl
* @returns {Promise.<GeoPoint|GeoLine|GeoRegion|Geometry>}
*/
async getCurrentGeometry() {
try {
var { geometryId, geoType } = await MC.getCurrentGeometry(this._SMMapControlId);
if (geoType == "GeoPoint") {
var geoPoint = new GeoPoint();
geoPoint._SMGeoPointId = geometryId;
} else if (geoType == "GeoRegion") {
var geoRegion = new GeoRegion();
geoRegion._SMGeoRegionId = geometryId;
} else if (geoType == "GeoLine") {
var geoLine = new GeoLine();
geoLine._SMGeoLineId = geometryId;
} else {
var geometry = new Geometry();
geometry._SMGeometryId = geometryId;
}
return geoPoint || geoLine || geoRegion || geometry;
} catch (e) {
console.error(e);
}
}
/**
* 获取导航控件
* @memberOf MapControl
* @returns {Promise.<Navigation2>}
*/
async getIndustryNavi() {
try {
var { navigation2Id } = await MC.getNavigation2(this._SMMapControlId);
var navigation2 = new Navigation2();
navigation2._SMNavigation2Id = navigation2Id;
return navigation2;
} catch (e) {
console.error(e);
}
}
/**
* 设置横竖屏切换监听器。(deprecated)
* @memberOf MapControl
* @param {object} events - 传入一个对象作为参数,该对象可以包含两个属性:toHorizontalScreen和toVerticalScreen。两个属性的值均为function类型,分部作为横屏与竖屏监听事件的处理函数。
* @returns {Promise.<void>}
*/
/*
async setConfigurationChangedListener(events){
try{
var success = await MC. setConfigurationChangedListener();
if(!success) return ;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.to_horizontal_screen',function (e) {
if(typeof events.toHorizontal_screen == 'function'){
events.toHorizontalScreen();
}else{
console.error("Please set a callback to the property 'toHorizontalScreen' in the first argument.");
}
});
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.to_verticalscreen',function (e) {
if(typeof events.toVerticalScreen == 'function'){
events.toVerticalScreen();
}else{
console.error("Please set a callback to the property 'toVerticalScreen' in the first argument.");
}
});
}catch (e){
console.error(e);
}
}
*/
/**
* 获得传统导航控件
* @memberOf MapControl
* @returns {Promise.<TraditionalNavi>}
*/
async getTraditionalNavi() {
try {
var { traditionalNaviId } = await MC.getTraditionalNavi(this._SMMapControlId);
var traditionalNavi = new TraditionalNavi();
traditionalNavi._SMTraditionalNaviId = traditionalNaviId;
return traditionalNavi;
} catch (e) {
console.error(e);
}
}
/**
* 返回地图控件中地图的当前操作状态。
* @memberOf MapControl
* @returns {Promise.<string>}
*/
async getAction() {
try {
var { actionType } = await MC.getAction(this._SMMapControlId);
var actionStr = 'type';
switch (actionType) {
case 0 :
actionStr = 'NONEACTION';
break;
case 1 :
actionStr = 'PAN';
break;
case 8 :
actionStr = 'SELECT';
break;
case 54 :
actionStr = 'VERTEXEDIT';
break;
case 55 :
actionStr = 'VERTEXADD';
break;
case 56 :
actionStr = 'DELETENODE';
break;
case 16 :
actionStr = 'CREATEPOINT';
break;
case 17 :
actionStr = 'CREATEPOLYLINE';
break;
case 27 :
actionStr = 'CREATEPOLYGON';
break;
case 1001 :
actionStr = 'MEASURELENGTH';
break;
case 1002 :
actionStr = 'MEASUREAREA';
break;
case 1003 :
actionStr = 'MEASUREANGLE';
break;
case 199 :
actionStr = 'FREEDRAW';
break;
case 3000 :
actionStr = 'CREATEPLOT';
break;
case 201 :
actionStr = 'ERASE_REGION';
break;
case 202 :
actionStr = 'SPLIT_BY_LINE';
break;
case 203 :
actionStr = 'UNION_REGION';
break;
case 204 :
actionStr = 'COMPOSE_REGION';
break;
case 205 :
actionStr = 'PATCH_HOLLOW_REGION';
break;
case 207 :
actionStr = 'INTERSECT_REGION';
break;
case 206 :
actionStr = 'FILL_HOLLOW_REGION';
break;
case 208 :
actionStr = 'PATCH_POSOTIONAL_REGION';
break;
case 209 :
actionStr = 'MOVE_COMMON_NODE';
break;
case 210 :
actionStr = 'CREATE_POSITIONAL_REGION';
break;
case 215 :
actionStr = 'SPLIT_BY_DRAWLINE';
break;
case 216 :
actionStr = 'DRAWREGION_HOLLOW_REGION';
break;
case 217 :
actionStr = 'DRAWREGION_ERASE_REGION';
break;
case 218 :
actionStr = 'SPLIT_BY_DRAWREGION';
break;
case 301 :
actionStr = 'MOVE_GEOMETRY';
break;
case 305 :
actionStr = 'MULTI_SELECT';
break;
case 501 :
actionStr = 'SWIPE';
break;
default :
throw new Error("Unknown Action Type");
}
return actionStr;
} catch (e) {
console.error(e);
}
}
/**
* 地图窗口上恢复上一步的操作。
* @memberOf MapControl
* @returns {Promise.<boolean>}
*/
async redo() {
try {
var { redone } = await MC.redo(this._SMMapControlId);
return redone;
} catch (e) {
console.error(e);
}
}
/**
* 地图控件上撤消上一次的操作。
* @memberOf MapControl
* @returns {Promise.<boolean>}
*/
async undo() {
try {
var { undone } = await MC.undo(this._SMMapControlId);
return undone;
} catch (e) {
console.error(e);
}
}
/**
* 取消操作,对于采集而言,新建的未提交的数据将被清除,对于编辑,将回到上一次提交保存的状态。
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async cancel() {
try {
var { canceled } = await MC.cancel(this._SMMapControlId);
return canceled;
} catch (e) {
console.error(e);
}
}
/**
* 删除当前绘制出来的几何对象。
* @memberOf MapControl
* @returns {Promise.<Promise.deleted>}
*/
async deleteCurrentGeometry() {
try {
var { deleted } = await MC.deleteCurrentGeometry(this._SMMapControlId);
return deleted;
} catch (e) {
console.error(e);
}
}
/**
* 获取当前编辑图层
* @memberOf MapControl
* @returns {Promise.<object>}
*/
async getEditLayer() {
try {
var { layerId } = await MC.getEditLayer(this._SMMapControlId);
var layer = new Layer();
layer._SMLayerId = layerId;
return layer;
} catch (e) {
console.error(e);
}
}
/**
* 添加对象删除完成监听器。(deprecated)
* @memberOf MapControl
* @param {object} event - event:{geometryDeleted: e => {...}} e:{layer:--, id:--,canceled:--} layer:操作的图层,被删除对象id,删除结果canceled,ture为删除成功,否则为false.
* @returns {Promise.<boolean>}
*/
/*
async addGeometryDeletedListener(event){
try{
var success = await MC.addGeometryDeletedListener(this._SMMapControlId);
if(!success) return ;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.geometry_deleted',function (e) {
if(typeof event.geometryDeleted === 'function'){
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
event.geometryDeleted(e);
}else{
console.error("Please set a callback to the first argument.");
}
});
return success;
}catch (e){
console.error(e);
}
}
*/
/**
* 移除对象删除完成监听器(deprecated)
* @memberOf MapControl
* @returns {Promise.<void>}
*/
/*
async removeGeometryDeletedListener(){
try{
await MC. removeGeometryDeletedListener(this._SMMapControlId);
}catch (e){
console.error(e);
}
}
*/
/**
* 添加对象添加监听器
* @memberOf MapControl
* @param {object} event - event:{geometryAdded: e => {...}} e:{layer:--, id:--,canceled:--} layer:操作的图层,操作对象id,操作结果canceled,ture为操作成功,否则为false.
* @returns {Promise.<*>}
*/
async addGeometryAddedListener(event) {
try {
var success = await MC.addGeometryAddedListener(this._SMMapControlId);
if (!success) return;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.grometry_added', function (e) {
if (typeof event.geometryAdded === 'function') {
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
event.geometryAdded(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
return success;
} catch (e) {
console.error(e);
}
}
/**
* 移除对象添加监听器。
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async removeGeometryAddedListener() {
try {
await MC.removeGeometryAddedListener(this._SMMapControlId);
} catch (e) {
console.error(e);
}
}
/**
* 添加对象删除完成前监听器。(deprecated)
* @memberOf MapControl
* @param {object} event - event:{geometryDeleting: e => {...}} e:{layer:--, id:--,canceled:--} layer:操作的图层,操作对象id,操作结果canceled,ture为操作成功,否则为false.
* @returns {Promise.<*>}
*/
/*
async addGeometryDeletingListener(event){
try{
var success = await MC.addGeometryDeletingListener(this._SMMapControlId);
if(!success) return ;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.geometry_deleting',function (e) {
if(typeof event.geometryDeleting === 'function'){
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
event.geometryDeleting(e);
}else{
console.error("Please set a callback to the first argument.");
}
});
return success;
}catch (e){
console.error(e);
}
}
*/
/**
* 移除对象删除完成前监听器。(deprecated)
* @memberOf MapControl
* @returns {Promise.<void>}
*/
/*
async removeGeometryDeletingListener(){
try{
await MC. removeGeometryDeletingListener(this._SMMapControlId);
}catch (e){
console.error(e);
}
}
*/
/**
* 添加对象修改完成监听器(deprecated)
* @memberOf MapControl
* @param {object} event - event:{geometryModified: e => {...}} e:{layer:--, id:--,canceled:--} layer:操作的图层,操作对象id,操作结果canceled,ture为操作成功,否则为false.
* @returns {Promise.<*>}
*/
/*
async addGeometryModifiedListener(event){
try{
var success = await MC.addGeometryModifiedListener(this._SMMapControlId);
if(!success) return ;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.geometry_modified',function (e) {
if(typeof event.geometryModified === 'function'){
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
event.geometryModified(e);
}else{
console.error("Please set a callback to the first argument.");
}
});
return success;
}catch (e){
console.error(e);
}
}
*/
/**
* 移除对象删除完成前监听器。(deprecated)
* @memberOf MapControl
* @returns {Promise.<void>}
*/
/*
async removeGeometryModifiedListener(){
try{
await MC. removeGeometryModifiedListener(this._SMMapControlId);
}catch (e){
console.error(e);
}
}
*/
/**
* 添加对象修改前监听器(deprecated)
* @memberOf MapControl
* @param event - event:{geometryModifying: e => {...}} e:{layer:--, id:--,canceled:--} layer:操作的图层,操作对象id,操作结果canceled,ture为操作成功,否则为false.
* @returns {Promise.<*>}
*/
/*
async addGeometryModifyingListener(event){
try{
var success = await MC.addGeometryModifyingListener(this._SMMapControlId);
if(!success) return ;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.geometry_modifying',function (e) {
if(typeof event.geometryModifying === 'function'){
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
event.geometryModifying(e);
}else{
console.error("Please set a callback to the first argument.");
}
});
return success;
}catch (e){
console.error(e);
}
}
*/
/**
* 移除对象修改完成监听器。(deprecated)
* @memberOf MapControl
* @returns {Promise.<void>}
*/
/*
async removeGeometryModifyingListener(){
try{
await MC. removeGeometryModifyingListener(this._SMMapControlId);
}catch (e){
console.error(e);
}
}
*/
/**
* 添加对象修改前监听器
* @memberOf MapControl
* @param events - events:{geometrySelected: e => {...},geometryMultiSelected e => {...}}
* geometrySelected 单个集合对象被选中事件的回调函数,参数e为获取结果 e:{layer:--, id:--} layer:操作的图层,操作对象id.
* geometryMultiSelected 多个集合对象被选中事件的回调函数,参数e为获取结果数组:e:{geometries:[layer:--,id:--]}
* @returns {Promise.<*>}
*/
async addGeometrySelectedListener(events) {
try {
var success = await MC.addGeometrySelectedListener(this._SMMapControlId);
if (!success) return;
//差异化
if (Platform.OS === 'ios') {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.geometry_selected', function (e) {
if (typeof events.geometrySelected === 'function') {
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
events.geometrySelected(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
nativeEvt.addListener('com.supermap.RN.Mapcontrol.geometry_multi_selected', function (e) {
if (typeof events.geometryMultiSelected === 'function') {
e.geometries.map(function (geometry) {
var layer = new Layer();
layer._SMLayerId = geometry.layerId;
geometry.layer = layer;
})
events.geometryMultiSelected(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
} else {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.geometry_selected', function (e) {
if (typeof events.geometrySelected === 'function') {
var layer = new Layer();
layer._SMLayerId = e.layerId;
e.layer = layer;
events.geometrySelected(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.geometry_multi_selected', function (e) {
if (typeof events.geometryMultiSelected === 'function') {
e.geometries.map(function (geometry) {
var layer = new Layer();
layer._SMLayerId = geometry.layerId;
geometry.layer = layer;
})
events.geometryMultiSelected(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
}
return success;
} catch (e) {
console.error(e);
}
}
/**
* 移除对象选中监听器。
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async removeGeometrySelectedListener() {
try {
await MC.removeGeometrySelectedListener(this._SMMapControlId);
} catch (e) {
console.error(e);
}
}
/**
* 添加量算回调监听器
* @memberOf MapControl
* @param events - events:{lengthMeasured: e => {...},areaMeasured: e => {...},e => {...},angleMeasured: e => {...}}
* lengthMeasured 长度量算结果。 e:{curResult:--, curPoint:{x:--,y--}
* areaMeasured 面积量算结果。 e:{curResult:--, curPoint:{x:--,y--}
* angleMeasured 测量角度结果 通过设置Action.MEASUREANGLE实现测量角度。 e:{curAngle:--, curPoint:{x:--,y--}
* @returns {Promise.<*>}
*/
async addMeasureListener(events) {
try {
var success = await MC.addMeasureListener(this._SMMapControlId);
if (!success) return;
if (Platform.OS === 'ios') {
if (typeof events.lengthMeasured === 'function') {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.length_measured', function (e) {
events.lengthMeasured(e);
});
}
if (typeof events.areaMeasured === 'function') {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.area_measured', function (e) {
events.areaMeasured(e);
});
}
if (typeof events.angleMeasured === 'function') {
nativeEvt.addListener('com.supermap.RN.Mapcontrol.angle_measured', function (e) {
events.angleMeasured(e);
});
}
} else {
if (typeof events.lengthMeasured === 'function') {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.length_measured', function (e) {
events.lengthMeasured(e);
});
}
if (typeof events.areaMeasured === 'function') {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.area_measured', function (e) {
events.areaMeasured(e);
});
}
if (typeof events.angleMeasured === 'function') {
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.angle_measured', function (e) {
events.angleMeasured(e);
});
}
}
return success;
} catch (e) {
console.error(e);
}
}
/**
* 移除量算监听器。
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async removeMeasureListener() {
try {
return await MC.removeMeasureListener(this._SMMapControlId);
} catch (e) {
console.error(e);
}
}
/**
* 设置Undo监听器。(deprecated)
* @memberOf MapControl
* @param event - event:{undoStateChange: e => {...}} e:{canUndo:--,canRedo:--} 返回参数canUndo表示是否可取消,canRedo表示是否可重复
* @returns {Promise.<*>}
*/
/*
async addUndoStateChangeListener(event){
try{
var success = await MC.addUndoStateChangeListener(this._SMMapControlId);
if(!success) return ;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.undo_state_change',function (e) {
if(typeof event.undoStateChange === 'function'){
event.undo_state_change(e);
}else{
console.error("Please set a callback to the first argument.");
}
});
return success;
}catch (e){
console.error(e);
}
}
*/
/**
* 移除Undo监听器。(deprecated)
* @memberOf MapControl
* @returns {Promise.<void>}
*/
/*
async removeUndoStateChangeListener(){
try{
await MC.removeUndoStateChangeListener(this._SMMapControlId);
}catch (e){
console.error(e);
}
}
*/
/**
* 设置编辑状态监听器。
* @memberOf MapControl
* @param events - events:{addNodeEnable: e => {...},deleteNodeEnable: e => {...}}
* addNodeEnable: 添加节点有效。e:{isEnable:--}
* deleteNodeEnable: 删除节点有效。 e:{isEnable:--}
* @returns {Promise.<*>}
*/
async setEditStatusListener(events) {
try {
var success = await MC.setEditStatusListener(this._SMMapControlId);
if (!success) return;
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.add_node_enable', function (e) {
if (typeof events.addNodeEnable === 'function') {
events.addNodeEnable(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
DeviceEventEmitter.addListener('com.supermap.RN.Mapcontrol.delete_node_enable', function (e) {
if (typeof events.deleteNodeEnable === 'function') {
events.deleteNodeEnable(e);
} else {
console.error("Please set a callback to the first argument.");
}
});
return success;
} catch (e) {
console.error(e);
}
}
/**
* 添加、删除节点事件的监听器。
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async removeEditStatusListener() {
try {
await MC.removeEditStatusListener(this._SMMapControlId);
} catch (e) {
console.error(e);
}
}
/**
* 添加标绘库。
* @memberOf MapControl
* @returns {Promise.<int>}
*/
async addPlotLibrary(url) {
try {
var libId = await MC.addPlotLibrary(this._SMMapControlId, url);
return libId;
} catch (e) {
console.error(e);
}
}
/**
* 添加标绘库。
* @memberOf MapControl
* @returns {Promise.<void>}
*/
async removePlotLibrary(libId) {
try {
var isRemove = await MC.removePlotLibrary(this._SMMapControlId, libId);
} catch (e) {
console.error(e);
}
}
/**
* 设置标绘图案。
* @memberOf MapControl
* @returns {Promise.<int>}
*/
async setPlotSymbol(libId, symbolCode) {
try {
var isSet = await MC.setPlotSymbol(this._SMMapControlId, libId, symbolCode);
} catch (e) {
console.error(e);
}
}
/**
* 返回采集类
* @returns {Promise.<Collector>}
*/
async getCollector() {
try {
let id = await MC.getCollector(this._SMMapControlId);
let collector = new Collector()
collector._SMCollectorId = id
return collector
} catch (e) {
console.error(e);
}
}
/**
* 将当前显示内容绘制到指定位图上, 并获取路径
* @params params Object
* mapView Object
* width int
* height int
* quality int 0 - 100
* type string png, jpg/jpeg, webp
* @returns {Promise.<{result: Promise.result, uri: Promise.uri}>}
*/
async outputMap(params = {}) {
try {
let paramss = {width: 2000, height: 2000, quality: 60, type: 'png', mapViewId: ''}
Object.assign(paramss, params, {mapViewId: params.mapView._SMMapViewId})
let { result, uri } = await MC.outputMap(this._SMMapControlId, paramss.mapViewId, paramss.width, paramss.height, paramss.quality, paramss.type);
return { result, uri }
} catch (e) {
console.error(e);
}
}
/**
* 指定编辑几何对象
* @param geoID
* @param layer
* @returns {Promise}
*/
async appointEditGeometry(geoID, layer) {
try {
return await MC.appointEditGeometry(this._SMMapControlId, geoID, layer._SMLayerId);
} catch (e) {
console.error(e);
}
}
/**
* 释放对象
* @returns {Promise.<void>}
*/
async dispose() {
try {
await MC.dispose(this._SMMapControlId);
} catch (e) {
console.error(e);
}
}
// /**
// * 设置touch监听
// * @returns {Promise.<Collector>}
// */
// async setOnTouchListener(events) {
// try {
// let success = await MC.setOnTouchListener(this._SMMapControlId);
// if (!success) return;
// nativeEvt.addListener('com.supermap.RN.Mapcontrol.touch_up', function (e) {
// if (typeof events.onTouchUp === 'function') {
// events.onTouchUp(e);
// } else {
// console.error("Please set a callback to the first argument.");
// }
// });
// } catch (e) {
// console.error(e);
// }
// }
}