Commit 22323871 by Luosp

去掉导航,保留自有需求功能

parent 8753c057
apply plugin: 'com.android.library'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "0.0.2"
consumerProguardFiles 'consumer-rules.pro'
ndk {
abiFilters "armeabi-v7a"
// abiFilters "arm64-v8a"
// abiFilters "armeabi"
}
}
buildTypes {
release {
minifyEnabled true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
packagingOptions {
exclude 'assets/tnavi/HCI_AUTH/HCI_AUTH_FOREVER'
exclude 'assets/tnavi/log/gpspos_data.txt'
exclude 'assets/tnavi/pdata/fx.sdb'
exclude 'assets/tnavi/pdata/font.pdt'
exclude 'assets/tnavi/pdata/res.pdt'
exclude 'assets/tnavi/sdb/cdata/rsh_0.sdb'
exclude 'assets/tnavi/sdb/cdata/zon.sdb'
exclude 'assets/tnavi/sdb/cdata/man.cdt'
exclude 'assets/tnavi/sdb/cdata/rsh.sdb'
exclude 'assets/tnavi/sdb/cdata/url.cdt'
exclude 'assets/tnavi/sdb/cdata/gd.sdb'
exclude 'assets/tnavi/sdb/cdata/ano.cdt'
exclude 'assets/tnavi/sdb/adata/tmp'
exclude 'assets/tnavi/config.ini'
exclude 'assets/tnavi/Dictionary.Dat'
exclude 'assets/tnavi/udata/utmp.txt'
exclude 'assets/tnavi/DictionaryWordSort.dat'
exclude 'assets/AccountInfo.txt'
}
}
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
//arcgis地图
implementation 'com.esri.arcgisruntime:arcgis-android:100.6.0'
//权限
implementation 'com.yanzhenjie:permission:2.0.3'
//请求工具类
implementation 'com.squareup.okhttp3:okhttp:3.12.3'
//gson
implementation 'com.google.code.gson:gson:2.8.5'
}
apply from: '../mvn_push.gradle'
ARTIFACT_ID = map
VERSION = 0.0.1
PACKAGING = aar
DESCRIPTION = first create map lib
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#############################################
#
# 对于一些基本指令的添加
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify
# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# 可以把代码以及所使用到的各种第三方库代码统统移动到同一个包下
-repackageclasses cn.com.founder.arcgislib.view
#############################################
#
# Android开发中一些需要保留的公共部分
#
#############################################
# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
# 保留support下的所有类及其内部类
-keep class android.support.** {*;}
# 保留继承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
# 保留R下面的资源
-keep class **.R$* {*;}
# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留在Activity中的方法参数是view的方法,
# 这样以来我们在layout中写的onClick就不会被影响
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 保留枚举类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留我们自定义控件(继承自View)不被混淆
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保留Parcelable序列化类不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable序列化的类不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 对于带有回调函数**On*Listener的,不能被混淆
-keepclassmembers class * {
void *(**On*Listener);
}
#-------------- okhttp3 start-------------
# OkHttp3
# https://github.com/square/okhttp
# okhttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.* { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
# okhttp 3
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
#----------okhttp end--------------
-keep class com.esri.arcgisruntime.**{ *; }
-dontwarn com.esri.arcgisruntime.**
-keep class cn.com.founder.arcgislib.nonavi.ArcGisFounder{ *; }
-keepclassmembers class cn.com.founder.arcgislib.nonavi.ArcGisFounder$ArcGisFounderBuilder{
public *;
}
-keepclassmembers class cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView$CalloutStyleBuilder{
public *;
}
-keepclassmembers class cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView$CalloutContentBuilder{
public *;
}
-keepclassmembers class cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView$ClusterStyleBuilder{
public *;
}
-keep class cn.com.founder.arcgislib.nonavi.location.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.location.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.compass.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.compass.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.zoom.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.zoom.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.search.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.search.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.cluster.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.cluster.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.draw.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.draw.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.hotpots.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.model.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.view.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.cluster.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.draw.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.popup.**{ *; }
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="cn.com.founder.arcgislib.nonavi">
<!--网络-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--定位-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--导航-->
<!-- 允许在SDCard中创建与删除文件 -->
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<!--允许不同用户的应用之间可以产生交互-->
<uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
tools:ignore="ProtectedPermissions" />
<!-- 允许程序打开网络套接字 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许程序访问网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许用户改变WiFi连接状态 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 程序访问粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 允许用户访问精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许程序读取手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 允许程序写入外部存储设备 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序读取所有者数据 -->
<uses-permission android:name="android.permission.READ_OWNER_DATA" />
<!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!--8.0 安装未知程序权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<!-- 允许程序读取日志 -->
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions"/>
<!--arcgis地图 2D-->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:hardwareAccelerated="true"
tools:targetApi="n" >
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="cn.com.founder.arcgislib.nonavi.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_provider_file" />
</provider>
</application>
</manifest>
package cn.com.founder.arcgislib.nonavi.cluster;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.cluster.listener.IClusterPointInfoListener;
import cn.com.founder.arcgislib.nonavi.cluster.option.IArcGisClusterOption;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/16 15:55
* EMail:luo_shaopeng@founder.com.cn
* Description:聚合
*/
public class ArcGisCluster implements IArcGisClusterOption {
/**
* {@link ArcGisClusterView}
*/
private ArcGisClusterView mArcGisClusterView;
public ArcGisCluster(ArcGisClusterView arcGisClusterView) {
this.mArcGisClusterView = arcGisClusterView;
}
/**
* @param isShow boolean-是否显示聚合布局
* 默认显示
*/
@Override
public IArcGisClusterOption setShowClusterLayout(boolean isShow) {
mArcGisClusterView.setShowClusterLayout(isShow);
return this;
}
/**
* @param location {@link Variable.ViewLocation } ClusterView显示位置
*/
@Override
public IArcGisClusterOption setClusterViewLocation(Variable.ViewLocation location) {
mArcGisClusterView.setClusterViewLocation(location);
return this;
}
/**
* @param clusterImage int(资源ID)-聚合图片
*/
@Override
public IArcGisClusterOption setClusterImage(int clusterImage) {
mArcGisClusterView.setClusterImage(clusterImage);
return this;
}
/**
* @param pointList 聚合点集合
*/
@Override
public IArcGisClusterOption setCluseterData(List<PointModel> pointList) {
mArcGisClusterView.setClusterData(pointList);
return this;
}
@Override
public IArcGisClusterOption setGeoDistance(double distance) {
mArcGisClusterView.setGeoDistance(distance);
return this;
}
@Override
public IArcGisClusterOption setIClusterPointInfoListener(IClusterPointInfoListener clusterPointInfoListener) {
mArcGisClusterView.setIClusterPointInfoListener(clusterPointInfoListener);
return this;
}
/**
* @return 得到聚合样式
*/
@Override
public ArcGisClusterView.ClusterStyleBuilder getClusterStyleBuilder() {
return mArcGisClusterView.getClusterStyleBuilder();
}
@Override
public ArcGisClusterView.CalloutStyleBuilder getCalloutStyleBuilder() {
return mArcGisClusterView.getCalloutStyleBuilder();
}
@Override
public ArcGisClusterView.CalloutContentBuilder getCalloutContentBuilder() {
return mArcGisClusterView.getCalloutContentBuilder();
}
}
package cn.com.founder.arcgislib.nonavi.cluster.listener;
import cn.com.founder.arcgislib.nonavi.model.LocationModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/6/30 18:32
* EMail:luo_shaopeng@founder.com.cn
* Description:聚合选择得点得信息
*/
public interface IClusterPointInfoListener {
/**
* 点信息回调
* @param locationModel {@link LocationModel}
*/
void pointInfoCallBack(LocationModel locationModel);
}
package cn.com.founder.arcgislib.nonavi.cluster.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.cluster.listener.IClusterPointInfoListener;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/16 15:56
* EMail:luo_shaopeng@founder.com.cn
* Description:聚合
*/
public interface IArcGisClusterOption {
/**
* @param isShow boolean-是否显示聚合布局
* 默认显示
*/
IArcGisClusterOption setShowClusterLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } ClusterView显示位置
*/
IArcGisClusterOption setClusterViewLocation(Variable.ViewLocation location);
/**
* @param clusterImage int(资源ID)-聚合图片
*/
IArcGisClusterOption setClusterImage(int clusterImage);
/**
* @param pointList 聚合点集合
*/
IArcGisClusterOption setCluseterData(List<PointModel> pointList);
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*
*/
IArcGisClusterOption setGeoDistance(double distance);
/**
* @param clusterPointInfoListener 设置聚合点信息回调
*/
IArcGisClusterOption setIClusterPointInfoListener(IClusterPointInfoListener clusterPointInfoListener);
/**
* @return 得到聚合样式
*/
ArcGisClusterView.ClusterStyleBuilder getClusterStyleBuilder();
/**
* callout样式
*/
ArcGisClusterView.CalloutStyleBuilder getCalloutStyleBuilder();
/**
* callout内容样式
*/
ArcGisClusterView.CalloutContentBuilder getCalloutContentBuilder();
}
package cn.com.founder.arcgislib.nonavi.common;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 17:37
* EMail:luo_shaopeng@founder.com.cn
* Description:共同变量
*/
public class Variable {
public static enum DrawType {
TEXT,
POINT,
LINE,
POLYGON,
ORTHOGON,
CIRCLE;
}
public static enum GraphType {
LINE,
POLYGON,
ORTHOGON,
CIRCLE,
ELLIPSE,
RHOMBUS;
}
public static enum Measure {
M,
KM,
KIM,
M2,
KM2,
HM2,
A2;
}
public static enum LayerType {
TILE,
WMTS,
IMG,
BUNDLE
}
public static enum ViewLocation{
LEFT_TOP,
RIGHT_TOP,
CENTER,
LEFT_BOTTOM,
RIGHT_BOTTOM
}
public static enum TouchUp{
UP,
RORATE,
LONG_PRESS
}
public static enum CalloutLeaderPosition{
DEFAULT,
AUTO
}
public static enum SearchType{
NONE,
SEARCH,
SEARCH_TYPE_RESULT,
START_ADDRESS_SEARCH,
END_ADDRESS_SEARCH,
}
public static enum InputCalendar{
START,
END
}
public static enum LocationChangeType implements Parcelable {
START_LOCATION,
MOVE_MAP,
CLICK_MAP,
IMPORT_POINT,
CALLOUT_OK;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<LocationChangeType> CREATOR = new Creator<LocationChangeType>() {
@Override
public LocationChangeType createFromParcel(Parcel in) {
return LocationChangeType.values()[in.readInt()];
}
@Override
public LocationChangeType[] newArray(int size) {
return new LocationChangeType[size];
}
};
}
}
package cn.com.founder.arcgislib.nonavi.compass;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.compass.listener.IOnClickListener;
import cn.com.founder.arcgislib.nonavi.compass.listener.IRotationListener;
import cn.com.founder.arcgislib.nonavi.compass.option.IArcGisCompassOption;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapCompassView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 14:20
* EMail:luo_shaopeng@founder.com.cn
* Description:罗盘操作
*/
public class ArcGisCompass implements IArcGisCompassOption {
/**
* {@link ArcGisMapCompassView}
*/
private ArcGisMapCompassView mArcGisMapCompassView;
public ArcGisCompass(ArcGisMapCompassView arcGisMapCompassView) {
this.mArcGisMapCompassView = arcGisMapCompassView;
}
/**
* @param isShow boolean-是否显示罗盘布局
*/
@Override
public IArcGisCompassOption setShowCompassLayout(boolean isShow) {
mArcGisMapCompassView.setShowCompassLayout(isShow);
return this;
}
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
@Override
public IArcGisCompassOption setCompassViewLocation(Variable.ViewLocation location) {
mArcGisMapCompassView.setCompassViewLocation(location);
return this;
}
/**
* @param compassImage int(资源ID)-罗盘图片
*/
@Override
public IArcGisCompassOption setCompassImage(int compassImage) {
mArcGisMapCompassView.setCompassImage(compassImage);
return this;
}
/**
* @param iOnClickListener 罗盘点击事件
*/
@Override
public IArcGisCompassOption setOnClik(IOnClickListener iOnClickListener) {
mArcGisMapCompassView.setIOnClik(iOnClickListener);
return this;
}
/**
* @param iRotationListener 罗盘旋转事件
*/
@Override
public IArcGisCompassOption setIRotationAngleListener(IRotationListener iRotationListener) {
mArcGisMapCompassView.setIRotationListener(iRotationListener);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.compass.listener;
import android.view.View;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 14:48
* EMail:luo_shaopeng@founder.com.cn
* Description:点击事件
*/
public interface IOnClickListener {
/**
* @param v 点击罗盘监听
*/
void onClick(View v);
}
package cn.com.founder.arcgislib.nonavi.compass.listener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 15:27
* EMail:luo_shaopeng@founder.com.cn
* Description:地图旋转接口
*/
public interface IRotationListener {
/**
* 旋转监听
*/
void iRotationAngleListener();
}
package cn.com.founder.arcgislib.nonavi.compass.option;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.compass.listener.IOnClickListener;
import cn.com.founder.arcgislib.nonavi.compass.listener.IRotationListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 14:21
* EMail:luo_shaopeng@founder.com.cn
* Description:罗盘操作
*/
public interface IArcGisCompassOption {
/**
* @param isShow boolean-是否显示罗盘布局
* 默认显示
*/
IArcGisCompassOption setShowCompassLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
IArcGisCompassOption setCompassViewLocation(Variable.ViewLocation location);
/**
* @param compassImage int(资源ID)-罗盘图片
*/
IArcGisCompassOption setCompassImage(int compassImage);
/**
* @param iOnClickListener 罗盘点击事件
* @return
*/
IArcGisCompassOption setOnClik(IOnClickListener iOnClickListener);
/**
* @param iRotationListener 罗盘旋转事件
*/
IArcGisCompassOption setIRotationAngleListener(IRotationListener iRotationListener);
}
package cn.com.founder.arcgislib.nonavi.constants;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 15:41
* EMail:luo_shaopeng@founder.com.cn
* Description:Url 管理
*/
public class Constants {
/*****************************************互联网*********************************************
//互联网-地图
private static String baseUrl = "http://47.92.225.109:6080/arcgis/rest/services/founder/dg20191120/MapServer";
//互联网-Geo
private static String baseGeoUrl = "http://68.174.25.107:8090/esBzdzTestQuery";
//互联网-newGeo
private static String baseNewGeoUrl = "http://68.174.69.46:8051/queryRgeo";
//互联网-搜索
private static String searchUrl = "http://47.92.226.24:8051/selectPoiDataList";
//二标四实-单位
private static String dwUrl = "http://68.174.69.46:8051/selectVdwjx";
//二标四实-房屋
private static String fwUrl = "http://68.174.69.46:8051/selectVfwjx";
//二标四实-地址
private static String dzUrl = "http://68.174.69.46:8051/selectVdzjx";
//热力图
private static String hotMapUrl = "http://47.92.225.109:6080/arcgis/rest/services/gp/rltModel/GPServer/hotPotServer";
// private static String hotMapUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/911CallsHotspot/GPServer/911%20Calls%20Hotspot";
/**********************************************************************************************/
/*****************************************用户网***********************************************/
//用户网-地图
private static String baseUrl = "http://192.168.2.56:19076/arcgis/rest/services/founder/dg20191120/MapServer";
//公安网-Geo
private static String baseGeoUrl = "http://192.168.2.56:19087/esBzdzTestQuery";
//用户网-newGeo
private static String baseNewGeoUrl = "http://192.168.2.56:19084/queryRgeo";
//用户网-搜索
private static String searchUrl = "http://192.168.2.56:19084/selectPoiDataList";
//二标四实-单位
private static String dwUrl = "http://192.168.2.56:19084/selectVdwjx";
//二标四实-房屋
private static String fwUrl = "http://192.168.2.56:19084/selectVfwjx";
//二标四实-地址
private static String dzUrl = "http://192.168.2.56:19084/selectVdzjx";
//热力图
private static String hotMapUrl = "http://192.168.2.56:19088/arcgis/rest/services/gp/rltModel/GPServer/hotPotServer";
/**********************************************************************************************
/*****************************************公安网***********************************************
//公安网-地图
private static String baseUrl = "http://68.174.69.45:6080/arcgis/rest/services/founder/dg20191120/MapServer";
//公安网-Geo
private static String baseGeoUrl = "http://68.174.25.107:8090/esBzdzTestQuery";
//公安网-newGeo
private static String baseNewGeoUrl = "http://68.174.69.46:8051/queryRgeo";
//公安网-搜索
private static String searchUrl = "http://68.174.69.46:8051/selectPoiDataList";
//二标四实-单位
private static String dwUrl = "http://68.174.69.46:8051/selectVdwjx";
//二标四实-房屋
private static String fwUrl = "http://68.174.69.46:8051/selectVfwjx";
//二标四实-地址
private static String dzUrl = "http://68.174.69.46:8051/selectVdzjx";
//热力图
private static String hotMapUrl = "http://68.174.69.45:6081/arcgis/rest/services/gp/rltModel/GPServer/hotPotServer";
/**********************************************************************************************/
// argis证书
private static String baseRunTime = "runtimelite,1000,rud9526010123,none,XXMFA0PL4S0MC2EN0175";
//天地图key,使用的是服务器端
private static String baseTianDiTuKey = "39edeab91620fe3c5a1b282228ef6e46";
//天地图Geo
private static String baseTianDiTuGeoUrl = "http://api.tianditu.gov.cn/geocoder";
//arcGis证书
public static final String BASE_MAP_RUNTIME = baseRunTime;
//服务器Url
public static final String BASE_MAP_SERVER_URL = baseUrl;
//天地图
public static final String BASE_TIANDITU_KEY = baseTianDiTuKey;
//天地图逆地理编码查询
public static final String BASE_TIANDITU_GEO_URL = baseTianDiTuGeoUrl;
//逆地理编码
// public static final String BASE_GEO_URL = baseGeoUrl;
public static final String BASE_GEO_URL = baseNewGeoUrl;
//搜索
public static final String BASE_SEARCH_URL = searchUrl;
//热力图
public static final String BASE_HOT_POTS_URL = hotMapUrl;
//二标四实-房屋
public static final String BASE_FW_URL = fwUrl;
//二标四实-地址
public static final String BASE_DZ_URL = dzUrl;
//二标四实-单位
public static final String BASE_DW_URL = dwUrl;
}
package cn.com.founder.arcgislib.nonavi.draw;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.draw.option.IArcGisDrawOption;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisDrawView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 15:15
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public class ArcGisDraw implements IArcGisDrawOption {
/**
* {@link ArcGisDrawView}
*/
private ArcGisDrawView mArcGisDrawView;
public ArcGisDraw(ArcGisDrawView arcGisDrawView) {
this.mArcGisDrawView = arcGisDrawView;
}
@Override
public IArcGisDrawOption setShowDrawLayout(boolean isShow) {
mArcGisDrawView.setShowDrawLayout(isShow);
return this;
}
@Override
public IArcGisDrawOption setDrawViewLocation(Variable.ViewLocation location) {
mArcGisDrawView.setDrawViewLocation(location);
return this;
}
@Override
public IArcGisDrawOption setDrawImage(int drawImage) {
mArcGisDrawView.setDrawImage(drawImage);
return this;
}
/**
* @param canvaType 绘制类型:
* "LINE" 线
* "POLYGON" 多边形
* "ORTHOGON" 矩形
* "CIRCLE" 圆
* @param pointModelList 数据集合点
*/
@Override
public IArcGisDrawOption setDrawPointData(String canvaType, List<PointModel> pointModelList) {
mArcGisDrawView.setDrawPointData(canvaType,pointModelList);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.draw.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 15:16
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public interface IArcGisDrawOption {
/**
* @param isShow boolean-是否显示绘制布局
* 默认显示
*/
IArcGisDrawOption setShowDrawLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } DrawView显示位置
*/
IArcGisDrawOption setDrawViewLocation(Variable.ViewLocation location);
/**
* @param drawImage int(资源ID)-绘制图片
*/
IArcGisDrawOption setDrawImage(int drawImage);
/**
* @param canvaType 绘制类型:
* "LINE" 线
* "POLYGON" 多边形
* "ORTHOGON" 矩形 2的倍数点
* "CIRCLE" 圆 2的倍数点
* @param pointModelList 数据集合点
*/
IArcGisDrawOption setDrawPointData(String canvaType, List<PointModel> pointModelList);
}
package cn.com.founder.arcgislib.nonavi.hotpots;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.hotpots.option.IArcGisHotPotsOption;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisHotPotsView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/15 17:33
* EMail:luo_shaopeng@founder.com.cn
* Description:热力图
*/
public class ArcGisHotPots implements IArcGisHotPotsOption {
/**
* {@link ArcGisHotPotsView}
*/
private ArcGisHotPotsView mArcGisHotPots;
public ArcGisHotPots(ArcGisHotPotsView mArcGisHotPots) {
this.mArcGisHotPots = mArcGisHotPots;
}
@Override
public IArcGisHotPotsOption setShowHotPotsLayout(boolean isShow) {
mArcGisHotPots.setShowHotPotsLayout(isShow);
return this;
}
@Override
public IArcGisHotPotsOption setHotPotsViewLocation(Variable.ViewLocation location) {
mArcGisHotPots.setHotPotsViewLocation(location);
return this;
}
@Override
public IArcGisHotPotsOption setHotPotsImage(int hotPotsImage) {
mArcGisHotPots.setHotPotsImage(hotPotsImage);
return this;
}
@Override
public IArcGisHotPotsOption setHotPotsPonitData(List<PointModel> pointList) {
mArcGisHotPots.setHotPotsPointData(pointList);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.hotpots.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/15 17:34
* EMail:luo_shaopeng@founder.com.cn
* Description:热力图
*/
public interface IArcGisHotPotsOption {
/**
* @param isShow boolean-是否显示热力图布局
* 默认隐藏
*/
IArcGisHotPotsOption setShowHotPotsLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } HotPotsView显示位置
*/
IArcGisHotPotsOption setHotPotsViewLocation(Variable.ViewLocation location);
/**
* @param hotPotsImage int(资源ID)-热力图图片
*/
IArcGisHotPotsOption setHotPotsImage(int hotPotsImage);
/**
* @param pointList 点集合
*/
IArcGisHotPotsOption setHotPotsPonitData(List<PointModel> pointList);
}
package cn.com.founder.arcgislib.nonavi.location;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.location.listener.ILocationChangeListener;
import cn.com.founder.arcgislib.nonavi.location.option.IArcGisLocationOption;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/5 15:17
* EMail:luo_shaopeng@founder.com.cn
* Description:位置操作
*/
public class ArcGisLocation implements IArcGisLocationOption {
/**
* {@link ArcGisMapView}
*/
private ArcGisLocationView mArcGisLocationView;
public ArcGisLocation(ArcGisLocationView arcGisLocationView) {
this.mArcGisLocationView = arcGisLocationView;
}
/**
* 获取当前位置 默认值5d
*/
@Override
public IArcGisLocationOption startLocation(double scale) {
mArcGisLocationView.startLocation(scale);
return this;
}
/**
* @param x x点
* @param y 点
*/
@Override
public IArcGisLocationOption startLocation(double x, double y, double scale) {
mArcGisLocationView.startLocation(x, y, scale);
return this;
}
/**
* @param locationChangeListener 设置位置监听
*/
@Override
public IArcGisLocationOption setLocationChangeListener(ILocationChangeListener locationChangeListener) {
mArcGisLocationView.setILocationChangeListener(locationChangeListener);
return this;
}
/**
* @return 停止定位
*/
@Override
public IArcGisLocationOption stopLocation() {
mArcGisLocationView.stopLocation();
return this;
}
/**
* @param isShow boolean-是否显示定位布局
*/
@Override
public IArcGisLocationOption setShowLocationLayout(boolean isShow) {
mArcGisLocationView.setShowLocationLayout(isShow);
return this;
}
/**
* @param isShow boolean-是否显示导入布局
*/
@Override
public IArcGisLocationOption setShowTXTImportLayout(boolean isShow) {
mArcGisLocationView.setShowTXTImportLayout(isShow);
return this;
}
/**
* @param location {@link Variable.ViewLocation } LocationView显示位置
*/
@Override
public IArcGisLocationOption setLocationViewLocation(Variable.ViewLocation location) {
mArcGisLocationView.setLocationViewLocation(location);
return this;
}
/**
* @param locationImage int(资源ID)-定位图片
*/
@Override
public IArcGisLocationOption setLocationImage(int locationImage) {
mArcGisLocationView.setLocationImage(locationImage);
return this;
}
/**
* @param importImage int(资源ID)-导入图片
*/
@Override
public IArcGisLocationOption setImportImage(int importImage) {
mArcGisLocationView.setImportImage(importImage);
return this;
}
/**
* @param centerLocationImage int(资源ID)-中心位置图片
*/
@Override
public IArcGisLocationOption setCenterLocationImage(int centerLocationImage) {
mArcGisLocationView.setCenterLocationImage(centerLocationImage);
return this;
}
/**
* @param labelLocationNormalImage int(资源ID)-标记位置正常图片
*/
@Override
public IArcGisLocationOption setLabelLocationNormalImage(int labelLocationNormalImage) {
mArcGisLocationView.setLabelLocationNormalImage(labelLocationNormalImage);
return this;
}
/**
* @param labelLocationSelectedImage int(资源ID)-标记位置选中图片
*/
@Override
public IArcGisLocationOption setLabelLocationSelectedImage(int labelLocationSelectedImage) {
mArcGisLocationView.setLabelLocationSelectedImage(labelLocationSelectedImage);
return this;
}
/**
* @param pointModelList 导入点数据{@link PointModel}
*/
@Override
public IArcGisLocationOption setImportPointData(List<PointModel> pointModelList) {
mArcGisLocationView.setImportPointData(pointModelList);
return this;
}
/**
* @param isFollow 设置是否跟随地图获取中心点
*/
@Override
public IArcGisLocationOption setFollowMapViewPoint(boolean isFollow) {
mArcGisLocationView.setFollowMapViewPoint(isFollow);
return this;
}
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*/
@Override
public IArcGisLocationOption setGeoDistance(double distance) {
mArcGisLocationView.setGeoDistance(distance);
return this;
}
/**
* @param showMap 是否显示地图,默认显示
*/
@Override
public IArcGisLocationOption setShowMap(boolean showMap) {
mArcGisLocationView.setShowMap(showMap);
return this;
}
/**
* @param showLoading 是否显示请求加载框,默认显示
*/
@Override
public IArcGisLocationOption setShowLoading(boolean showLoading) {
mArcGisLocationView.setShowLoading(showLoading);
return this;
}
@Override
public ArcGisLocationView.CalloutStyleBuilder getCalloutStyleBuilder() {
return mArcGisLocationView.getCalloutStyleBuilder();
}
@Override
public ArcGisLocationView.CalloutContentBuilder getCalloutContentBuilder() {
return mArcGisLocationView.getCalloutContentBuilder();
}
}
package cn.com.founder.arcgislib.nonavi.location.listener;
import cn.com.founder.arcgislib.nonavi.model.LocationModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/7 17:00
* EMail:luo_shaopeng@founder.com.cn
* Description:位置改变监听
*/
public interface ILocationChangeListener {
/**
* 位置信息回调
* @param locationModel {@link LocationModel}
*/
void locationCallBack(LocationModel locationModel);
}
package cn.com.founder.arcgislib.nonavi.location.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.location.listener.ILocationChangeListener;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/5 15:18
* EMail:luo_shaopeng@founder.com.cn
* Description:位置
*/
public interface IArcGisLocationOption {
/**
* 开始定位
* @param scale 初始地图Zoom层级 默认4d
*/
IArcGisLocationOption startLocation(double scale);
/**
* 手动定位
* @param x x点
* @param y 点
*/
IArcGisLocationOption startLocation(double x, double y,double scale);
/**
* @param locationChangeListener 设置位置监听
*/
IArcGisLocationOption setLocationChangeListener(ILocationChangeListener locationChangeListener);
/**
* @return 停止获取位置
*/
IArcGisLocationOption stopLocation();
/**
* @param isShow boolean-是否显示定位布局
* 默认显示
*/
IArcGisLocationOption setShowLocationLayout(boolean isShow);
/**
* @param isShow boolean-是否显示导入TXT布局
* 默认隐藏
*/
IArcGisLocationOption setShowTXTImportLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } LocationView显示位置
*/
IArcGisLocationOption setLocationViewLocation(Variable.ViewLocation location);
/**
* @param locationImage int(资源ID)-定位图片
*/
IArcGisLocationOption setLocationImage(int locationImage);
/**
* @param importImage int(资源ID)-导入图片
*/
IArcGisLocationOption setImportImage(int importImage);
/**
* @param centerLocationImage int(资源ID)-中心位置图片
*/
IArcGisLocationOption setCenterLocationImage(int centerLocationImage);
/**
* @param labelLocationNormalImage int(资源ID)-标记位置正常图片
*/
IArcGisLocationOption setLabelLocationNormalImage(int labelLocationNormalImage);
/**
* @param labelLocationSelectedImage int(资源ID)-标记位置选中图片
*/
IArcGisLocationOption setLabelLocationSelectedImage(int labelLocationSelectedImage);
/**
* @param pointModelList 导入点数据{@link PointModel}
*/
IArcGisLocationOption setImportPointData(List<PointModel> pointModelList);
/**
* @param isFollow 设置是否跟随地图获取中心点
* 默认不跟随
*/
IArcGisLocationOption setFollowMapViewPoint(boolean isFollow);
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*
*/
IArcGisLocationOption setGeoDistance(double distance);
/**
* @param showMap 是否显示地图,默认显示
*/
IArcGisLocationOption setShowMap(boolean showMap);
/**
* @param showLoading 是否显示请求加载框,默认显示
*/
IArcGisLocationOption setShowLoading(boolean showLoading);
/**
* callout样式
*/
ArcGisLocationView.CalloutStyleBuilder getCalloutStyleBuilder();
/**
* callout内容样式
*/
ArcGisLocationView.CalloutContentBuilder getCalloutContentBuilder();
}
package cn.com.founder.arcgislib.nonavi.model;
import android.os.Parcel;
import android.os.Parcelable;
import cn.com.founder.arcgislib.nonavi.common.Variable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/7 17:32
* EMail:luo_shaopeng@founder.com.cn
* Description:位置数据模型
*/
public class LocationModel implements Parcelable {
/**
* x点
*/
private double xPoint;
/**
* y点
*/
private double yPoint;
/**
* 地址
*/
private String address;
/**
* poi
*/
private String poi;
/**
* 补充信息
*/
private String extraInfo;
private Variable.LocationChangeType locationChangeType;
private boolean isPoiData = true;
public LocationModel(double xPoint, double yPoint, String address, String poi, String extraInfo, Variable.LocationChangeType locationChangeType) {
this.xPoint = xPoint;
this.yPoint = yPoint;
this.address = address;
this.poi = poi;
this.extraInfo = extraInfo;
this.locationChangeType = locationChangeType;
}
public LocationModel(double xPoint, double yPoint, String address, String poi, String extraInfo) {
this.xPoint = xPoint;
this.yPoint = yPoint;
this.address = address;
this.poi = poi;
this.extraInfo = extraInfo;
}
private LocationModel(Parcel in){
this.xPoint = in.readDouble();
this.yPoint = in.readDouble();
this.address = in.readString();
this.poi = in.readString();
this.extraInfo = in.readString();
this.locationChangeType = in.readParcelable(Variable.LocationChangeType.class.getClassLoader());
this.isPoiData = in.readByte() != 0;
}
public static final Creator<LocationModel> CREATOR = new Creator<LocationModel>() {
@Override
public LocationModel createFromParcel(Parcel in) {
return new LocationModel(in);
}
@Override
public LocationModel[] newArray(int size) {
return new LocationModel[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeDouble(xPoint);
parcel.writeDouble(yPoint);
parcel.writeString(address);
parcel.writeString(poi);
parcel.writeString(extraInfo);
parcel.writeParcelable(locationChangeType,i);
parcel.writeByte(this.isPoiData ? (byte) 1 : (byte) 0);
}
/**
* @return double-得到X点
*/
public double getXPoint() {
return xPoint;
}
/**
* @param xPoint 设置X点
*/
public void setXPoint(double xPoint) {
this.xPoint = xPoint;
}
/**
* @return double-得到Y点
*/
public double getYPoint() {
return yPoint;
}
/**
* @param yPoint 设置Y点
*/
public void setYPoint(double yPoint) {
this.yPoint = yPoint;
}
/**
* @return String-得到地址
*/
public String getAddress() {
return address;
}
/**
* @param address 设置地址
*/
public void setAddress(String address) {
this.address = address;
}
/**
* @return String-得到poi
*/
public String getPoi() {
return poi;
}
/**
* @param poi 设置poi
*/
public void setPoi(String poi) {
this.poi = poi;
}
/**
* @return String-得到补充信息
*/
public String getExtraInfo() {
return extraInfo;
}
/**
* @param extraInfo 设置补充信息
*/
public void setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
}
public String getLocationChangeType() {
switch (locationChangeType){
case START_LOCATION:
return "START_LOCATION";
case MOVE_MAP:
return "MOVE_MAP";
case CLICK_MAP:
return "CLICK_MAP";
case IMPORT_POINT:
return "IMPORT_POINT";
case CALLOUT_OK:
return "CALLOUT_OK";
default:
return "未知操作";
}
}
public void setLocationChangeType(Variable.LocationChangeType locationChangeType) {
this.locationChangeType = locationChangeType;
}
public double getxPoint() {
return xPoint;
}
public void setxPoint(double xPoint) {
this.xPoint = xPoint;
}
public double getyPoint() {
return yPoint;
}
public void setyPoint(double yPoint) {
this.yPoint = yPoint;
}
public boolean isPoiData() {
return isPoiData;
}
public void setPoiData(boolean poiData) {
isPoiData = poiData;
}
}
package cn.com.founder.arcgislib.nonavi.model;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/4/16 09:49
* EMail:luo_shaopeng@founder.com.cn
* Description:当前项目导入点实体类
*/
public class PointModel implements Parcelable {
/**
* x点 (经度 longitude)
*/
private double xPoint;
/**
* y点 (纬度 latitude)
*/
private double yPoint;
private String pointName;
public PointModel(){}
public PointModel(double xPoint, double yPoint) {
this.xPoint = xPoint;
this.yPoint = yPoint;
}
public PointModel(double xPoint, double yPoint, String pointName) {
this.xPoint = xPoint;
this.yPoint = yPoint;
this.pointName = pointName;
}
public PointModel(Parcel in){
xPoint = in.readDouble();
yPoint = in.readDouble();
pointName = in.readString();
}
public static final Creator<PointModel> CREATOR = new Creator<PointModel>() {
@Override
public PointModel createFromParcel(Parcel in) {
return new PointModel(in);
}
@Override
public PointModel[] newArray(int size) {
return new PointModel[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeDouble(xPoint);
parcel.writeDouble(yPoint);
parcel.writeString(pointName);
}
public double getxPoint() {
return xPoint;
}
public void setxPoint(double xPoint) {
this.xPoint = xPoint;
}
public double getyPoint() {
return yPoint;
}
public void setyPoint(double yPoint) {
this.yPoint = yPoint;
}
public String getPointName() {
return pointName;
}
public void setPointName(String pointName) {
this.pointName = pointName;
}
}
package cn.com.founder.arcgislib.nonavi.model;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/13 17:05
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索结果
*/
public class SearchModel implements Parcelable {
/**
* 名称
*/
private String poiname;
/**
* 地址
*/
private String poiaddress;
/**
* 经度 longitude
*/
private double x;
/**
* 纬度 latitude
*/
private double y;
/**
* 客户要求需区分数据源,目前在搜索时poi和二标四十
*/
private boolean isPoiData;
public SearchModel(){}
public String getPoiname() {
return poiname;
}
public void setPoiname(String poiname) {
this.poiname = poiname;
}
public String getPoiaddress() {
return poiaddress;
}
public void setPoiaddress(String poiaddress) {
this.poiaddress = poiaddress;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public boolean isPoiData() {
return isPoiData;
}
public void setPoiData(boolean poiData) {
isPoiData = poiData;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.poiname);
dest.writeString(this.poiaddress);
dest.writeDouble(this.x);
dest.writeDouble(this.y);
dest.writeByte(this.isPoiData ? (byte) 1 : (byte) 0);
}
protected SearchModel(Parcel in) {
this.poiname = in.readString();
this.poiaddress = in.readString();
this.x = in.readDouble();
this.y = in.readDouble();
this.isPoiData = in.readByte() != 0;
}
public static final Creator<SearchModel> CREATOR = new Creator<SearchModel>() {
@Override
public SearchModel createFromParcel(Parcel source) {
return new SearchModel(source);
}
@Override
public SearchModel[] newArray(int size) {
return new SearchModel[size];
}
};
}
package cn.com.founder.arcgislib.nonavi.option;
import cn.com.founder.arcgislib.nonavi.cluster.option.IArcGisClusterOption;
import cn.com.founder.arcgislib.nonavi.compass.option.IArcGisCompassOption;
import cn.com.founder.arcgislib.nonavi.draw.option.IArcGisDrawOption;
import cn.com.founder.arcgislib.nonavi.hotpots.option.IArcGisHotPotsOption;
import cn.com.founder.arcgislib.nonavi.location.option.IArcGisLocationOption;
import cn.com.founder.arcgislib.nonavi.search.option.IArcGisSearchOption;
import cn.com.founder.arcgislib.nonavi.zoom.option.IArcGisZoomOption;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:23
* EMail:luo_shaopeng@founder.com.cn
* Description:地图操作
*/
public interface IOption {
/**
* 位置操作
*/
IArcGisLocationOption arcGisLocationOption();
/**
* 缩放操作
*/
IArcGisZoomOption arcGisZoomOption();
/**
* 罗盘操作
*/
IArcGisCompassOption arcGisCompassOption();
/**
* 搜索操作
*/
IArcGisSearchOption arcGisSearchOption();
/**
* 热力图操作
*/
IArcGisHotPotsOption arcGisHotPotsOption();
/**
* 聚合操作
*/
IArcGisClusterOption arcGisClusterOption();
/**
* 绘制操作
*/
IArcGisDrawOption arcGisDrawOption();
}
package cn.com.founder.arcgislib.nonavi.search;
import cn.com.founder.arcgislib.nonavi.search.listener.ISearchSelectedListener;
import cn.com.founder.arcgislib.nonavi.search.option.IArcGisSearchOption;
import cn.com.founder.arcgislib.nonavi.view.ArcGisSearchView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/11 19:37
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索
*/
public class ArcGisSearch implements IArcGisSearchOption {
/**
* {@link ArcGisSearchView}
*/
private ArcGisSearchView mArcGisSearchView;
public ArcGisSearch(ArcGisSearchView arcGisSearchView) {
this.mArcGisSearchView = arcGisSearchView;
}
/**
* @param type 搜索类型:0:poi,1:实有单位,2:实有房屋,3:标准地址
* @param keyWord 关键字
*/
@Override
public IArcGisSearchOption setSearchData(int type, String keyWord) {
mArcGisSearchView.setSearchData(type,keyWord);
return this;
}
@Override
public IArcGisSearchOption setSearchSelectedListener(ISearchSelectedListener listener) {
mArcGisSearchView.setSearchSelectedListener(listener);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.search.listener;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.model.SearchModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/5/13 10:03
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索接口回调
*/
public interface ISearchResultListener {
/**
* @param searchModelList 搜索回调
*/
void callBack(List<SearchModel> searchModelList);
}
package cn.com.founder.arcgislib.nonavi.search.listener;
import cn.com.founder.arcgislib.nonavi.model.SearchModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/14 19:00
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索选择监听
*/
public interface ISearchSelectedListener {
/**
* @param searchModel 选择的结果
*/
void selectedResult(SearchModel searchModel);
}
package cn.com.founder.arcgislib.nonavi.search.option;
import cn.com.founder.arcgislib.nonavi.search.listener.ISearchSelectedListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/11 19:38
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索
*/
public interface IArcGisSearchOption {
/**
* @param type 搜索类型:0:poi,1:实有单位,2:实有房屋,3:标准地址
* @param keyWord 关键字
*/
IArcGisSearchOption setSearchData(int type , String keyWord);
/**
* @param listener 设置列表点击事件监听
*/
IArcGisSearchOption setSearchSelectedListener(ISearchSelectedListener listener);
}
package cn.com.founder.arcgislib.nonavi.source;
import android.app.Activity;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:06
* EMail:luo_shaopeng@founder.com.cn
* Description:Activity Context
*/
public class ActivitySource extends Source implements LifecycleOwner {
private Activity activity;
public ActivitySource (Activity activity){
this.activity = activity;
}
@Override
public Context getContext() {
return activity;
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return null;
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.content.Context;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:07
* EMail:luo_shaopeng@founder.com.cn
* Description:Context
*/
public class ContextSource extends Source {
private Context context;
public ContextSource(Context context){
this.context = context;
}
@Override
public Context getContext() {
return context;
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.app.Fragment;
import android.content.Context;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:09
* EMail:luo_shaopeng@founder.com.cn
* Description:Fragment Context
*/
public class FragmentSource extends Source{
private Fragment fragment;
public FragmentSource (Fragment fragment){
this.fragment = fragment;
}
@Override
public Context getContext() {
return fragment.getActivity();
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.annotation.RequiresApi;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:01
* EMail:luo_shaopeng@founder.com.cn
* Description:全局最基层类
*/
public abstract class Source {
/**
* @return Context
*/
public abstract Context getContext();
/**
* 版本
*/
private int mTargetSdkVersion;
/**
* 包名
*/
private String mPackageName;
/**
* 包名管理
*/
private PackageManager mPackageManager;
/**
* app管理
*/
private AppOpsManager mAppOpsManager;
/**
* 通知
*/
private NotificationManager mNotificationManager;
/**
* @return 获取版本
*/
public int getTargetSdkVersion() {
if (mTargetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mTargetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
}
return mTargetSdkVersion;
}
/**
* @return 获取包名
*/
public String getPackageName() {
if (mPackageName == null) {
mPackageName = getContext().getApplicationContext().getPackageName();
}
return mPackageName;
}
private PackageManager getPackageManager() {
if (mPackageManager == null) {
mPackageManager = getContext().getPackageManager();
}
return mPackageManager;
}
/**
* @return app
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private AppOpsManager getAppOpsManager() {
if (mAppOpsManager == null) {
mAppOpsManager = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
}
return mAppOpsManager;
}
/**
* @return 通知
*/
private NotificationManager getNotificationManager() {
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
}
return mNotificationManager;
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.content.Context;
import androidx.fragment.app.Fragment;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:13
* EMail:luo_shaopeng@founder.com.cn
* Description:androidx Fragment Context
*/
public class XFragmentSource extends Source{
private Fragment fragment;
public XFragmentSource (Fragment fragment){
this.fragment = fragment;
}
@Override
public Context getContext() {
return fragment.getContext();
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.content.Context;
import android.util.DisplayMetrics;
/**
* 导航屏幕工具
*/
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
public static int getScreenWidth(Context context){
DisplayMetrics dm = context.getResources().getDisplayMetrics();
return dm.widthPixels;
}
public static int getScreenHeight(Context context){
DisplayMetrics dm = context.getResources().getDisplayMetrics();
return dm.heightPixels;
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.text.TextUtils;
import java.math.BigDecimal;
/**
* Created by lijingru on 2017/4/18.
*/
public class FormatUtil {
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
// if (minute< 10){
// return hour+":0"+minute;
// }
// return hour+":"+minute;
if (hour == 0 ){
return minute+" 分钟";
}
return hour+" 小时 "+minute+" 分钟";
}
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime2(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
// if (minute< 10){
// return hour+":0"+minute;
// }
// return hour+":"+minute;
if (hour == 0 ){
return minute+"分钟";
}
return hour+"小时 "+minute+"分钟";
}
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime3(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
// if (minute< 10){
// return hour+":0"+minute;
// }
// return hour+":"+minute;
if (hour == 0 ){
return minute+"分钟";
}
return hour+"小时"+minute+"分钟";
}
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime00(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
if (minute< 10){
return hour+":0"+minute;
}
return hour+":"+minute;
}
/**
* 时间的表示方式
* @param mm 毫秒
* @return XX分钟
*/
public static int FormatTimeToMinute(long mm){
int hour,minute,second;
second = (int) (mm/1000);
minute = second/60;
return minute;
}
/**
* 距离的KM表示方式
* @return
*/
public static String FormatDistByKM(long ulDist) {
String strdist = null;
int ulDistanceResult = 0;
/* 避免显示出1.0公里、2.0公里、9.0公里等 */
if (ulDist / 100 * 100 % 1000 == 0) {
strdist = ulDist / 1000 + "";
} else {
// ulDist = (ulDist ) /100 * 100;
/* sprintf函数会自动四舍五入*/
float fDistanceResult = (float) ulDist / (float) 1000;
BigDecimal org = new BigDecimal(fDistanceResult);
org = org.setScale(1, BigDecimal.ROUND_HALF_UP);
fDistanceResult = org.floatValue();
if (fDistanceResult * 10 % 10 == 0) {
strdist = (int) fDistanceResult + "";
} else {
strdist = fDistanceResult + "";
}
}
return strdist;
}
public static String FormatDistKm(long ulDist){
String strdist = FormatDist(ulDist);
strdist = strdist.replace("米","m");
strdist = strdist.replace("公里","Km");
return strdist;
}
/**
* 距离的公里表示方式
* @return
*/
public static String FormatDistOnKM(long ulDist) {
String strdist = null;
int ulDistanceResult = 0;
if (ulDist < 10) {
strdist = "0.1";
} else if (ulDist < 1000) {
ulDistanceResult = Math.round((float)ulDist / 10) * 10;
if (ulDistanceResult == 1000) {
strdist = "1";
}else {
strdist = "0." + ulDistanceResult/100;
}
} else if(ulDist < 100000) {
/* 避免显示出1.0公里、2.0公里、9.0公里等 */
if (ulDist / 100 * 100 % 1000 == 0) {
strdist = ulDist / 1000 + "";
} else {
// ulDist = (ulDist ) /100 * 100;
/* sprintf函数会自动四舍五入*/
float fDistanceResult = (float) ulDist / (float) 1000;
BigDecimal org = new BigDecimal(fDistanceResult);
org = org.setScale(1, BigDecimal.ROUND_HALF_UP);
fDistanceResult = org.floatValue();
if (fDistanceResult * 10 % 10 == 0) {
strdist = (int) fDistanceResult + "";
} else {
strdist = fDistanceResult + "";
}
}
} else {
ulDistanceResult = Math.round((float)ulDist / 1000);
if (ulDistanceResult > 9999) {
ulDistanceResult = 9999;
}
strdist = ulDistanceResult + "";
}
return strdist;
}
/**
* 距离的统一表示方式
* @return
*/
public static String FormatDist(long ulDist) {
String strdist = null;
int ulDistanceResult = 0;
if (ulDist == 0)
ulDist = 1;
if (ulDist < 10) {
strdist = ulDist + "米";
} else if (ulDist < 1000) {
ulDistanceResult = Math.round((float)ulDist / 10) * 10;
if (ulDistanceResult == 1000) {
strdist = "1公里";
}else {
strdist = ulDistanceResult + "米";
}
} else if (ulDist < 100000) {
strdist = inOneAndHundredKM(ulDist);
} else {
strdist = moreHundredKM(ulDist);
}
return strdist;
}
// /**
// * 距离的统一表示方式
// * @return
// */
// public static Tuple.TwoTuple FormatDistForT(long ulDist) {
// Tuple.TwoTuple tuple = null;
// String strdist = null;
// String danwei = null;
// int ulDistanceResult = 0;
// if (ulDist < 10) {
// strdist = ulDist+"";
// danwei = "米";
// } else if (ulDist < 1000) {
// ulDistanceResult = Math.round((float)ulDist / 10) * 10;
// if (ulDistanceResult == 1000) {
// strdist = "1";
// danwei = "公里";
// }else {
// strdist = ulDistanceResult + "";
// danwei = "米";
// }
// } else if (ulDist < 100000) {
// strdist = inOneAndHundredKM(ulDist);
// strdist = strdist.replace("公里","");
// danwei = "公里";
// } else {
// strdist = moreHundredKM(ulDist);
// strdist = strdist.replace("公里","");
// danwei = "公里";
// }
// tuple = new Tuple.TwoTuple(strdist,danwei);
// return tuple;
// }
/**
* 大于1公里小于100公里的距离格式化
* @return
*/
public static String inOneAndHundredKM(long ulDist){
String strdist;
/* 避免显示出1.0公里、2.0公里、9.0公里等 */
if (ulDist / 100 * 100 % 1000 == 0) {
strdist = ulDist / 1000 + "公里";
} else {
// ulDist = (ulDist ) /100 * 100;
/* sprintf函数会自动四舍五入*/
float fDistanceResult = (float) ulDist / (float) 1000;
BigDecimal org = new BigDecimal(fDistanceResult);
org = org.setScale(1, BigDecimal.ROUND_HALF_UP);
fDistanceResult = org.floatValue();
if (fDistanceResult * 10 % 10 == 0) {
strdist = (int) fDistanceResult + "公里";
} else {
strdist = fDistanceResult + "公里";
}
}
return strdist;
}
/**
* 大于100公里的距离格式化
* @return
*/
public static String moreHundredKM(long ulDist){
String strdist;
int ulDistanceResult = Math.round((float)ulDist / 1000);
if (ulDistanceResult > 9999) {
ulDistanceResult = 9999;
}
strdist = ulDistanceResult + "公里";
return strdist;
}
/**
* 格式化周期Str
*
* @param week
* @return
*/
public static String FormatWeek(String week) {
String pushDates = "";
if (!TextUtils.isEmpty(week)){
if (week.equals("1|2|3|4|5")) {
pushDates = "工作日";
} else if (week.equals("6|7")) {
pushDates = "周末";
} else if (week.equals("1|2|3|4|5|6|7")) {
pushDates = "每天";
} else {
String str = week;
str = str.replace("1", "一");
str = str.replace("2", "二");
str = str.replace("3", "三");
str = str.replace("4", "四");
str = str.replace("5", "五");
str = str.replace("6", "六");
str = str.replace("7", "日");
str = str.replace("|", ",");
pushDates = "周" + str;
}
}
return pushDates;
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/18 11:27
* EMail:luo_shaopeng@founder.com.cn
* Description:转化工具类
*/
public class GpsUtil {
private final static double a = 6378245.0;
private final static double pi = 3.1415926535897932384626;
private final static double ee = 0.00669342162296594323;
/**
* 计算地球上任意两点(经纬度)距离
*
* @param lat1 第一点纬度
* @param lng1 第一点经度
* @param lat2 第二点纬度
* @param lng2 第二点经度
* @return 返回距离 单位:米
*/
public static double distance(double lat1, double lng1, double lat2, double lng2) {
double a, b, R;
R = 6378137; // 地球半径
lat1 = lat1 * Math.PI / 180.0;
lat2 = lat2 * Math.PI / 180.0;
a = lat1 - lat2;
b = (lng1 - lng2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2 * R * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));
return d;
}
/**
* Description: WGS-84 to GCJ-02 <BR>
*
* @param latitude 纬度
* @param longitude 经度
* @return [纬度,经度]
*/
public static double[] toGCJ02Point(double latitude, double longitude) {
double[] dev = calDev(latitude, longitude);
double retLat = latitude + dev[0];
double retLon = longitude + dev[1];
return new double[]{retLat, retLon};
}
/**
* Description: WGS-84 to GCJ-02 <BR>
*
* @param latitude 纬度
* @param longitude 经度
* @param scale 经纬度保留小数位数
* @return [纬度,经度]
* @author dsn
* @date 2017年10月24日 下午2:09:27
* @version 1.0
*/
public static double[] toGCJ02Point(double latitude, double longitude, int scale) {
double[] dev = calDev(latitude, longitude);
double retLat = latitude + dev[0];
double retLon = longitude + dev[1];
return new double[]{new BigDecimal(retLat).setScale(scale, RoundingMode.DOWN).doubleValue(),
new BigDecimal(retLon).setScale(scale, RoundingMode.DOWN).doubleValue()};
}
/**
* Description:GCJ-02 to WGS-84 <BR>
*
* @param latitude 纬度
* @param longitude 经度
* @return [纬度,经度]
*/
public static double[] toWGS84Point(double latitude, double longitude) {
double[] dev = calDev(latitude, longitude);
double retLat = latitude - dev[0];
double retLon = longitude - dev[1];
dev = calDev(retLat, retLon);
retLat = latitude - dev[0];
retLon = longitude - dev[1];
return new double[]{retLat, retLon};
}
private static double[] calDev(double wgLat, double wgLon) {
if (isOutOfChina(wgLat, wgLon)) {
return new double[]{0, 0};
}
double dLat = calLat(wgLon - 105.0, wgLat - 35.0);
double dLon = calLon(wgLon - 105.0, wgLat - 35.0);
double radLat = wgLat / 180.0 * pi;
double magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
return new double[]{dLat, dLon};
}
private static boolean isOutOfChina(double lat, double lon) {
if (lon < 72.004 || lon > 137.8347)
return true;
if (lat < 0.8293 || lat > 55.8271)
return true;
return false;
}
private static double calLat(double x, double y) {
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
return ret;
}
private static double calLon(double x, double y) {
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
return ret;
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/13 17:16
* EMail:luo_shaopeng@founder.com.cn
* Description:gson
*/
public class GsonUtil {
private static Gson gson = null;
static {
if (gson == null) {
gson = new Gson();
}
}
private GsonUtil() {
}
/**
* 转成json
*
* @param object
* @return
*/
public static String gsonString(Object object) {
String gsonString = null;
if (gson != null) {
gsonString = gson.toJson(object);
}
return gsonString;
}
/**
* 转成bean
*
* @param gsonString
* @param cls
* @return
*/
public static <T> T gsonToBean(String gsonString, Class<T> cls) {
T t = null;
if (gson != null) {
t = gson.fromJson(gsonString, cls);
}
return t;
}
/**
* 转成list
* 泛型在编译期类型被擦除导致报错
* @param gsonString
* @param cls
* @return
*/
public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {
List<T> list = null;
if (gson != null) {
list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
}.getType());
}
return list;
}
/**
* 转成list
* 解决泛型问题
* @param json
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> jsonToList(String json, Class<T> cls) {
Gson gson = new Gson();
List<T> list = new ArrayList<T>();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for(final JsonElement elem : array){
list.add(gson.fromJson(elem, cls));
}
return list;
}
/**
* 转成list中有map的
*
* @param gsonString
* @return
*/
public static <T> List<Map<String, T>> gsonToListMaps(String gsonString) {
List<Map<String, T>> list = null;
if (gson != null) {
list = gson.fromJson(gsonString,
new TypeToken<List<Map<String, T>>>() {
}.getType());
}
return list;
}
/**
* 转成map的
*
* @param gsonString
* @return
*/
public static <T> Map<String, T> gsonToMaps(String gsonString) {
Map<String, T> map = null;
if (gson != null) {
map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
}.getType());
}
return map;
}
/**
* 按章节点得到相应的内容
* @param jsonString json字符串
* @param note 节点
* @return 节点对应的内容
*/
public static String getNoteJsonString(String jsonString,String note){
if(TextUtils.isEmpty(jsonString)){
throw new RuntimeException("json字符串");
}
if(TextUtils.isEmpty(note)){
throw new RuntimeException("note标签不能为空");
}
JsonElement element = new JsonParser().parse(jsonString);
if(element.isJsonNull()){
throw new RuntimeException("得到的jsonElement对象为空");
}
return element.getAsJsonObject().get(note).toString();
}
/**
* 按照节点得到节点内容,然后传化为相对应的bean数组
* @param jsonString 原json字符串
* @param note 节点标签
* @param beanClazz 要转化成的bean class
* @return 返回bean的数组
*/
public static <T> List<T> parserJsonToArrayBeans(String jsonString,String note,Class<T> beanClazz){
String noteJsonString = getNoteJsonString(jsonString,note);
return parserJsonToArrayBeans(noteJsonString,beanClazz);
}
/**
* 按照节点得到节点内容,转化为一个数组
* @param jsonString json字符串
* @param beanClazz 集合里存入的数据对象
* @return 含有目标对象的集合
*/
public static <T> List<T> parserJsonToArrayBeans(String jsonString,Class<T> beanClazz){
if(TextUtils.isEmpty(jsonString)){
throw new RuntimeException("json字符串为空");
}
JsonElement jsonElement = new JsonParser().parse(jsonString);
if(jsonElement.isJsonNull()){
throw new RuntimeException("得到的jsonElement对象为空");
}
if(!jsonElement.isJsonArray()){
throw new RuntimeException("json字符不是一个数组对象集合");
}
JsonArray jsonArray = jsonElement.getAsJsonArray();
List<T> beans = new ArrayList<T>();
for (JsonElement jsonElement2: jsonArray) {
T bean = new Gson().fromJson(jsonElement2, beanClazz);
beans.add(bean);
}
return beans;
}
/**
* 把相对应节点的内容封装为对象
* @param jsonString json字符串
* @param clazzBean 要封装成的目标对象
* @return 目标对象
*/
public static <T> T parserJsonToArrayBean(String jsonString,Class<T> clazzBean){
if(TextUtils.isEmpty(jsonString)){
throw new RuntimeException("json字符串为空");
}
JsonElement jsonElement = new JsonParser().parse(jsonString);
if(jsonElement.isJsonNull()){
throw new RuntimeException("json字符串为空");
}
if(!jsonElement.isJsonObject()){
throw new RuntimeException("json不是一个对象");
}
return new Gson().fromJson(jsonElement, clazzBean);
}
/**
* 按照节点得到节点内容,转化为一个数组
* @param jsonString json字符串
* @param note json标签
* @param clazzBean 集合里存入的数据对象
* @return 含有目标对象的集合
*/
public static <T> T parserJsonToArrayBean(String jsonString,String note,Class<T> clazzBean){
String noteJsonString = getNoteJsonString(jsonString, note);
return parserJsonToArrayBean(noteJsonString, clazzBean);
}
/**
* 把bean对象转化为json字符串
* @param obj bean对象
* @return 返回的是json字符串
*/
public static String toJsonString(Object obj){
if(obj!=null){
return new Gson().toJson(obj);
}else{
throw new RuntimeException("对象不能为空");
}
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/11 20:27
* EMail:luo_shaopeng@founder.com.cn
* Description:键盘
*/
public class KeyboardUtil {
/**
* 显示软键盘的延迟时间
*/
public static final int SHOW_KEYBOARD_DELAY_TIME = 200;
public final static int KEYBOARD_VISIBLE_THRESHOLD_DP = 100;
public static void showKeyboard(final EditText editText, boolean delay) {
showKeyboard(editText, delay ? SHOW_KEYBOARD_DELAY_TIME : 0);
}
/**
* 针对给定的editText显示软键盘(editText会先获得焦点). 可以和{@link #hideKeyboard(View)}
* 搭配使用,进行键盘的显示隐藏控制。
*/
public static void showKeyboard(final EditText editText, int delay) {
if (null == editText)
return;
if (!editText.requestFocus()) {
return;
}
if (delay > 0) {
editText.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) editText.getContext().getApplicationContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, delay);
} else {
InputMethodManager imm = (InputMethodManager) editText.getContext().getApplicationContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}
/**
* 隐藏软键盘 可以和{@link #showKeyboard(EditText, boolean)}搭配使用,进行键盘的显示隐藏控制。
*
* @param view 当前页面上任意一个可用的view
*/
public static boolean hideKeyboard(final View view) {
if (null == view)
return false;
InputMethodManager inputManager = (InputMethodManager) view.getContext().getApplicationContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
// 即使当前焦点不在editText,也是可以隐藏的。
return inputManager.hideSoftInputFromWindow(view.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
/**
* Set keyboard visibility change event listener.
*
* @param activity Activity
* @param listener KeyboardVisibilityEventListener
*/
@SuppressWarnings("deprecation")
public static void setVisibilityEventListener(final Activity activity,
final KeyboardVisibilityEventListener listener) {
if (activity == null) {
throw new NullPointerException("Parameter:activity must not be null");
}
if (listener == null) {
throw new NullPointerException("Parameter:listener must not be null");
}
final View activityRoot = ((ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0);
final ViewTreeObserver.OnGlobalLayoutListener layoutListener =
new ViewTreeObserver.OnGlobalLayoutListener() {
private final Rect r = new Rect();
private final int visibleThreshold = Math.round(
DensityUtil.dip2px(activity, KEYBOARD_VISIBLE_THRESHOLD_DP));
private boolean wasOpened = false;
@Override
public void onGlobalLayout() {
activityRoot.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRoot.getRootView().getHeight() - r.height();
boolean isOpen = heightDiff > visibleThreshold;
if (isOpen == wasOpened) {
// keyboard state has not changed
return;
}
wasOpened = isOpen;
boolean removeListener = listener.onVisibilityChanged(isOpen, heightDiff);
if (removeListener) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
activityRoot.getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
} else {
activityRoot.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
}
}
};
activityRoot.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
}
/**
* Determine if keyboard is visible
*
* @param activity Activity
* @return Whether keyboard is visible or not
*/
public static boolean isKeyboardVisible(Activity activity) {
Rect r = new Rect();
View activityRoot = ((ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0);
int visibleThreshold =
Math.round(DensityUtil.dip2px(activity, KEYBOARD_VISIBLE_THRESHOLD_DP));
activityRoot.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRoot.getRootView().getHeight() - r.height();
return heightDiff > visibleThreshold;
}
public interface KeyboardVisibilityEventListener {
/**
* @return to remove global listener or not
*/
boolean onVisibilityChanged(boolean isOpen, int heightDiff);
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.ConnectionPool;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2021/1/12 15:55
* EMail:luo_shaopeng@founder.com.cn
* Description:okhttp工具类
*/
public class OkHttpUtil {
private static OkHttpClient client;
public static OkHttpClient getInstance() {
if (client == null) {
synchronized (OkHttpUtil.class) {
if (client == null) {
client = (new OkHttpClient.Builder()).connectTimeout(10L, TimeUnit.SECONDS).
writeTimeout(10L, TimeUnit.SECONDS).readTimeout(10L, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1L, TimeUnit.SECONDS))
.sslSocketFactory(ToolUtil.getSSLSocketFactory())
.hostnameVerifier(ToolUtil.getHostnameVerifier()).build();
}
}
}
return client;
}
public static void doPost(String url, String jsonParams, Callback callback) {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);
Request request = (new okhttp3.Request.Builder()).url(url).post(body).build();
Call call = getInstance().newCall(request);
call.enqueue(callback);
}
public static void doGet(String url, Callback callback) {
Request request = (new okhttp3.Request.Builder()).url(url).build();
Call call = getInstance().newCall(request);
call.enqueue(callback);
}
}
\ No newline at end of file
package cn.com.founder.arcgislib.nonavi.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.widget.Toast;
import com.yanzhenjie.permission.AndPermission;
import java.util.List;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/3/22 0022 18:00
* EMail:luo_shaopeng@founder.com.cn
* Description:权限工具类
*/
public class PermissionUtil {
/**
* 请求权限
* @param requestPermissionCode 总是拒绝后提示用户去设置
* @param listener 权限申请监听
* @param permissionGroup 权限
*/
@SuppressLint("WrongConstant")
public static void requestPermission(Context context, int requestPermissionCode, final PermissionQuestListener listener, final String... permissionGroup) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (AndPermission.hasPermissions(context, permissionGroup)) {
listener.onGranted();
return;
}
// 没有权限,申请权限
AndPermission.with(context)
.runtime()
.permission(permissionGroup)
.onGranted(data -> {
if (listener != null){
listener.onGranted();
}
})
.onDenied(data -> {
if (AndPermission.hasAlwaysDeniedPermission(context, permissionGroup)) {
Toast.makeText(context,"定位权限获取失败",Toast.LENGTH_LONG).show();
} else {
//拒绝后重复请求
requestPermission(context,requestPermissionCode,listener, permissionGroup);
}
})
.start();
} else {
listener.onGranted();
}
}
/**
* 权限申请监听
*/
public interface PermissionQuestListener {
/**
* 允许获得权限后操作
*/
void onGranted();
/**
* 拒绝权限后操作
*
* @param data 权限列表
*/
void onDenied(List<String> data);
/**
* 总是拒绝后不再提示信息
*
* @return 权限
*/
String onAlwaysDenied();
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 15:47
* EMail:luo_shaopeng@founder.com.cn
* Description:BaseView
*/
public class ArcGisBaseView extends FrameLayout {
public ArcGisBaseView(@NonNull Context context) {
this(context, null, 0);
}
public ArcGisBaseView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ArcGisBaseView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
addView(new ArcGisMapView(context,attrs,defStyleAttr));
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.compass.listener.IOnClickListener;
import cn.com.founder.arcgislib.nonavi.compass.listener.IRotationListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 10:17
* EMail:luo_shaopeng@founder.com.cn
* Description:罗盘
*/
public class ArcGisMapCompassView extends LinearLayout implements View.OnClickListener, ArcGisMapView.MyTouchCompassListener {
/**
* 罗盘根布局
*/
private LinearLayout mCompassTotalLayout;
/**
* 罗盘图片
*/
private ImageView mCompassIv;
/**
* {@link ArcGisMapView}
*/
private ArcGisMapView mArcGisMapView;
/**
* {@link IOnClickListener}
*/
private IOnClickListener mIOnClickListener;
/**
* 罗盘旋转监听
*/
private IRotationListener mIRotationListener;
/**
* 是否显示罗盘
*/
private boolean isShowCompass = true;
@SuppressLint("ClickableViewAccessibility")
public ArcGisMapCompassView(Context context, ArcGisMapView arcGisMapView) {
this(context);
this.mArcGisMapView = arcGisMapView;
mArcGisMapView.setMyTouchCompassListener(this);
}
private ArcGisMapCompassView(Context context) {
this(context, null, 0);
}
private ArcGisMapCompassView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisMapCompassView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_compass, this);
mCompassTotalLayout = findViewById(R.id.compasss_layout);
mCompassIv = findViewById(R.id.compasss_iv);
mCompassIv.setOnClickListener(this);
}
/**
* @param isShow boolean-是否显示罗盘布局
* 默认显示
*/
public void setShowCompassLayout(boolean isShow) {
isShowCompass = isShow;
if (isShow) {
mCompassTotalLayout.setVisibility(VISIBLE);
} else {
mCompassTotalLayout.setVisibility(GONE);
}
}
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
public void setCompassViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mCompassTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mCompassTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mCompassTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
mCompassTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
break;
case RIGHT_BOTTOM:
mCompassTotalLayout.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
break;
}
}
/**
* @param compassImage int(资源ID)-罗盘图片
*/
public void setCompassImage(int compassImage) {
mCompassIv.setImageDrawable(getResources().getDrawable(compassImage));
}
public void setIOnClik(IOnClickListener iOnClickListener){
this.mIOnClickListener = iOnClickListener;
}
/**
* @param iRotationListener 地图旋转监听
*/
public void setIRotationListener(IRotationListener iRotationListener) {
this.mIRotationListener = iRotationListener;
}
@Override
public void onClick(View view) {
this.setVisibility(View.GONE);
mArcGisMapView.getMapView().setViewpointRotationAsync(0);
if(mIOnClickListener != null){
mIOnClickListener.onClick(view);
}
}
@Override
public void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent) {
if(touchUp == Variable.TouchUp.RORATE){
if(mIRotationListener != null){
mIRotationListener.iRotationAngleListener();
}
}
}
@Override
public void onRotate(double rotationAngle) {
if(isShowCompass){
if (rotationAngle != 0){
mCompassTotalLayout.setVisibility(View.VISIBLE);
mCompassIv.setRotation(-(float) rotationAngle);
postInvalidate();
}else{
mCompassTotalLayout.setVisibility(View.GONE);
}
}
}
}
\ No newline at end of file
package cn.com.founder.arcgislib.nonavi.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.esri.arcgisruntime.mapping.view.MapView;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
import cn.com.founder.arcgislib.nonavi.zoom.listener.IZoomClickListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:55
* EMail:luo_shaopeng@founder.com.cn
* Description:自定义缩放view
*/
public class ArcGisMapZoomView extends LinearLayout implements View.OnClickListener {
/**
* 根布局
*/
private LinearLayout mZoomTotalLayout;
/**
* 父布局
*/
private LinearLayout mZoomContentLayout;
/**
* 放大布局
*/
private LinearLayout mZoomInLayout;
/**
* 放大图片
*/
private ImageView mZoomInImage;
/**
* 放大文字
*/
private TextView mZoomInTextView;
/**
* 水平分割线
*/
private TextView mSpliteLineHor;
/**
* 垂直分割线
*/
private TextView mSpliteLineVer;
/**
* 缩小布局
*/
private LinearLayout mZoomOutLayout;
/**
* 缩小图片
*/
private ImageView mZoomOutImage;
/**
* 缩小文字
*/
private TextView mZoomOutTextView;
/**
* 放大倍数
*/
private double zoomInNum = 2;
/**
* 缩小倍数
*/
private double zoomOutNum = 2;
/**
* 缩放控件点击事件监听
*/
private IZoomClickListener zoomClickListener;
/**
* MapView
*/
private MapView mMapView;
public ArcGisMapZoomView(Context context, MapView mapView) {
this(context);
this.mMapView = mapView;
}
private ArcGisMapZoomView(Context context) {
this(context, null, 0);
}
private ArcGisMapZoomView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisMapZoomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_zoom, this);
initView();
}
/**
* 初始化view
*/
private void initView() {
mZoomTotalLayout = findViewById(R.id.zoom_total_layout);
mZoomContentLayout = findViewById(R.id.zoom_content_layout);
mZoomInLayout = findViewById(R.id.zoom_in_layout);
mZoomInImage = findViewById(R.id.zoom_in_iv);
mZoomInTextView = findViewById(R.id.zoom_in_tv);
mZoomOutLayout = findViewById(R.id.zoom_out_layout);
mZoomOutImage = findViewById(R.id.zoom_out_iv);
mZoomOutTextView = findViewById(R.id.zoom_out_tv);
mZoomInLayout.setOnClickListener(this);
mZoomOutLayout.setOnClickListener(this);
}
/**
* @param isShow boolean-是否显示缩放布局
* 默认显示
*/
public void setShowZoomLayout(boolean isShow) {
if (isShow) {
mZoomTotalLayout.setVisibility(VISIBLE);
mZoomContentLayout.setVisibility(VISIBLE);
} else {
mZoomTotalLayout.setVisibility(GONE);
mZoomContentLayout.setVisibility(GONE);
}
}
/**
* @param w int-缩放布局的宽度
* 默认wrap
*/
public void setZoomWidth(int w) {
mZoomInLayout.getLayoutParams().width = ToolUtil.valueToSp(getContext(), w);
mZoomOutLayout.getLayoutParams().width = ToolUtil.valueToSp(getContext(), w);
}
/**
* @param h int-缩放布局的高度
* 默认wrap
*/
public void setZoomHeight(int h) {
mZoomInLayout.getLayoutParams().height = ToolUtil.valueToSp(getContext(), h);
mZoomOutLayout.getLayoutParams().height = ToolUtil.valueToSp(getContext(), h);
}
/**
* @param bg int(资源ID)-缩放布局的背景
* 默认带阴影布局
*/
public void setZoomBackground(int bg) {
mZoomContentLayout.setBackground(getResources().getDrawable(bg));
}
/**
* @param horizontal boolean-缩放布局是否水平方向
* 默认垂直方向
*/
public void isHorizontal(boolean horizontal) {
if (horizontal) {
mZoomContentLayout.setOrientation(HORIZONTAL);
mSpliteLineVer.setVisibility(View.GONE);
mSpliteLineHor.setVisibility(View.VISIBLE);
} else {
mZoomContentLayout.setOrientation(VERTICAL);
mSpliteLineVer.setVisibility(View.VISIBLE);
mSpliteLineHor.setVisibility(View.GONE);
}
}
/**
* @param zoomInImage int(资源ID)-放大布局图片
*/
public void setZoomInImage(int zoomInImage) {
mZoomInImage.setImageDrawable(getResources().getDrawable(zoomInImage));
}
/**
* @param zoomOutImage int(资源ID)-缩小布局图片
*/
public void setZoomOutImage(int zoomOutImage) {
mZoomOutImage.setImageDrawable(getResources().getDrawable(zoomOutImage));
}
/**
* @param showText boolean-是否显示文字
* 默认显示
*/
public void setShowText(boolean showText) {
if (showText) {
mZoomInTextView.setVisibility(View.VISIBLE);
mZoomOutTextView.setVisibility(View.VISIBLE);
} else {
mZoomInTextView.setVisibility(View.GONE);
mZoomOutTextView.setVisibility(View.GONE);
}
}
/**
* @param zoomInText String-放大布局的文字
* 默认“放大”
*/
public void setZoomInText(String zoomInText) {
if (zoomInText == null) return;
mZoomInTextView.setText(zoomInText);
}
/**
* @param zoomOutText String-缩小布局的文字
* 默认“缩小”
*/
public void setZoomOutText(String zoomOutText) {
if (zoomOutText == null) return;
mZoomOutTextView.setText(zoomOutText);
}
/**
* @param fontSize int-缩放布局的文字大小
* 默认14sp
*/
public void setFontSize(int fontSize) {
mZoomInTextView.setTextSize(fontSize);
mZoomOutTextView.setTextSize(fontSize);
}
/**
* @param fontColor int-缩放布局的文字颜色
* 默认#333333
*/
public void setFontColor(int fontColor) {
int color = getResources().getColor(fontColor);
mZoomInTextView.setTextColor(color);
mZoomOutTextView.setTextColor(color);
}
/**
* @param num int-放大倍数
* 默认2
*/
public void setZoomInNum(int num) {
zoomInNum = num;
}
/**
* @param num int-缩小倍数
* 默认2
*/
public void setZoomOutNum(int num) {
zoomOutNum = num;
}
/**
* @param zoomClickListener 缩放事件监听
*/
public void setZoomClickListener(IZoomClickListener zoomClickListener) {
this.zoomClickListener = zoomClickListener;
}
/**
* @param location {@link Variable.ViewLocation }ZoomView显示位置
*/
public void setZoomViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mZoomTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mZoomTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mZoomTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
default:
mZoomTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.zoom_in_layout) {
double scale = mMapView.getMapScale();
double currScale = scale * (1.0 / zoomInNum);
mMapView.setViewpointScaleAsync(currScale);
if (zoomClickListener != null) {
zoomClickListener.zoomInClick(view, currScale);
}
} else if (view.getId() == R.id.zoom_out_layout) {
double scale = mMapView.getMapScale();
double currScale = scale * zoomInNum;
mMapView.setViewpointScaleAsync(currScale);
if (zoomClickListener != null) {
zoomClickListener.zoomInClick(view, currScale);
}
}
}
}
package cn.com.founder.arcgislib.nonavi.widget.draw;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import java.util.List;
public class DrawEntity {
private List<GraphicsOverlay> textGraphic=null;//文字集合
private List<GraphicsOverlay> polygonGraphic=null;//面集合
private List<GraphicsOverlay> lineGraphic=null;//线集合
private List<GraphicsOverlay> pointGraphic=null;//点集合
private List<List<Point>> pointGroup=null;//绘制点的集合的集合
public DrawEntity(List<GraphicsOverlay> textGraphic, List<GraphicsOverlay> polygonGraphic, List<GraphicsOverlay> lineGraphic, List<GraphicsOverlay> pointGraphic, List<List<Point>> pointGroup) {
this.textGraphic = textGraphic;
this.polygonGraphic = polygonGraphic;
this.lineGraphic = lineGraphic;
this.pointGraphic = pointGraphic;
this.pointGroup = pointGroup;
}
public DrawEntity(){
}
public List<GraphicsOverlay> getTextGraphic() {
return textGraphic;
}
public void setTextGraphic(List<GraphicsOverlay> textGraphic) {
this.textGraphic = textGraphic;
}
public List<GraphicsOverlay> getPolygonGraphic() {
return polygonGraphic;
}
public void setPolygonGraphic(List<GraphicsOverlay> polygonGraphic) {
this.polygonGraphic = polygonGraphic;
}
public List<GraphicsOverlay> getLineGraphic() {
return lineGraphic;
}
public void setLineGraphic(List<GraphicsOverlay> lineGraphic) {
this.lineGraphic = lineGraphic;
}
public List<GraphicsOverlay> getPointGraphic() {
return pointGraphic;
}
public void setPointGraphic(List<GraphicsOverlay> pointGraphic) {
this.pointGraphic = pointGraphic;
}
public List<List<Point>> getPointGroup() {
return pointGroup;
}
public void setPointGroup(List<List<Point>> pointGroup) {
this.pointGroup = pointGroup;
}
}
package cn.com.founder.arcgislib.nonavi.widget.draw;
import android.content.Context;
import com.esri.arcgisruntime.geometry.GeodeticCurveType;
import com.esri.arcgisruntime.geometry.GeometryEngine;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PolygonBuilder;
import com.esri.arcgisruntime.geometry.PolylineBuilder;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.mapping.view.MapView;
import java.util.ArrayList;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 17:33
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public class DrawView extends DrawLayer{
private Context context;
private MapView mapView;
private Variable.DrawType drawType=null;
private Variable.Measure measureLengthType=Variable.Measure.M;
private Variable.Measure measureAreaType=Variable.Measure.M2;
private double lineLength=0;
private List<Double> lengthList;
private List<Double> tmpLengthList;
public DrawView(Context context, MapView mapView) {
super(context, mapView);
this.context=context;
this.mapView=mapView;
lengthList=new ArrayList<>();
tmpLengthList=new ArrayList<>();
}
public void startMeasuredLength(float screenX,float screenY){
if(drawType==null) {
super.startLine();
drawType=Variable.DrawType.LINE;
}
drawScreenXY(screenX,screenY);
}
public void startMeasuredLength(android.graphics.Point screenPoint){
if(drawType==null) {
super.startLine();
drawType=Variable.DrawType.LINE;
}
drawScreenPoint(screenPoint);
}
public void startMeasuredArea(float screenX,float screenY){
if(drawType==null) {
super.startPolygon();
drawType=Variable.DrawType.POLYGON;
}
drawScreenXY(screenX,screenY);
}
public void startMeasuredArea(android.graphics.Point screenPoint){
if(drawType==null) {
super.startPolygon();
drawType=Variable.DrawType.POLYGON;
}
drawScreenPoint(screenPoint);
}
public boolean prevDraw(){
if(lengthList.size()>1) {
lengthList.remove(lengthList.size() - 1);
lineLength=lengthList.get(lengthList.size()-1);
}else{
lengthList.clear();
lineLength=0;
}
return super.prevDraw();
}
public boolean nextDraw(){
if(lengthList.size()>0 && lengthList.size()<tmpLengthList.size()) {
lengthList.add(tmpLengthList.get(lengthList.size()));
lineLength=lengthList.get(lengthList.size()-1);
}
return super.nextDraw();
}
public DrawEntity endMeasure(){
drawType=null;
lineLength=0;
tmpLengthList.clear();
lengthList.clear();
return super.endDraw();
}
public DrawEntity clearMeasure(){
drawType=null;
lineLength=0;
tmpLengthList.clear();
lengthList.clear();
return super.clear();
}
public void setSpatialReference(SpatialReference spatialReference) {
super.setSpatialReference(spatialReference);
}
public void setLengthType(Variable.Measure type){
this.measureLengthType=type;
}
public void setAreaType(Variable.Measure type){
this.measureAreaType=type;
}
private void drawScreenXY(float x, float y){
Point point=super.screenXYtoPpoint(x,y);
if( drawType==Variable.DrawType.LINE){
PolylineBuilder line=(PolylineBuilder)super.drawByGisPoint(point);
showLength(line,point);
}else if(drawType==Variable.DrawType.POLYGON){
PolygonBuilder polygon=(PolygonBuilder)super.drawByGisPoint(point);
showArea(polygon);
}
}
public void drawPointLine(Point point){
if(drawType==null) {
super.startLine();
drawType=Variable.DrawType.LINE;
}
PolylineBuilder line=(PolylineBuilder)super.drawByGisPoint(point);
showLength(line,point);
}
public void drawPointPolygon(Point point){
if(drawType==null) {
super.startPolygon();
drawType=Variable.DrawType.POLYGON;
}
PolygonBuilder polygon=(PolygonBuilder)super.drawByGisPoint(point);
showArea(polygon);
}
private void drawScreenPoint(android.graphics.Point screenPoint){
Point point=super.screenXYtoPpoint(screenPoint.x,screenPoint.y);
if( drawType==Variable.DrawType.LINE){
PolylineBuilder line=(PolylineBuilder)super.drawByScreenPoint(screenPoint);
showLength(line,point);
}else if(drawType==Variable.DrawType.POLYGON){
PolygonBuilder polygon=(PolygonBuilder)super.drawByScreenPoint(screenPoint);
showArea(polygon);
}
}
private void showLength(PolylineBuilder line,Point point){
if(line!=null) {
//double length = GeometryEngine.length(line.toGeometry());
double length = GeometryEngine.lengthGeodetic(line.toGeometry(),null, GeodeticCurveType.SHAPE_PRESERVING);
lineLength+=length;
lengthList.add(lineLength);
tmpLengthList.clear();
tmpLengthList.addAll(lengthList);
String s= ToolUtil.forMatDouble(Math.abs(ToolUtil.lengthChange(lineLength,measureLengthType)));
super.drawText(point,s+ToolUtil.lengthEnameToCname(measureLengthType),false);
}
}
private void showArea(PolygonBuilder polygon){
if(polygon!=null) {
//double area = GeometryEngine.area(polygon.toGeometry());
double area = GeometryEngine.areaGeodetic(polygon.toGeometry(),null, GeodeticCurveType.SHAPE_PRESERVING);
String s=ToolUtil.forMatDouble(Math.abs(ToolUtil.areaChange(area,measureAreaType)));
super.drawText(polygon.toGeometry().getExtent().getCenter(),s+ToolUtil.lengthEnameToCname(measureAreaType),true);
}
}
}
package cn.com.founder.arcgislib.nonavi.widget.popup;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.com.founder.arcgislib.nonavi.R;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/4/2 10:27
* EMail:luo_shaopeng@founder.com.cn
* Description:类似popup的dialog--入口
*/
public class PopupDialog extends Dialog {
private static final int DEFAULT_CONTENT_LAYOUT= R.layout.layout_popup_default;
private int mContentLayoutId=-1;//弹出窗体的内容layout
private View mContentLayout;//弹出窗体的内容布局
private int mGravity= Gravity.BOTTOM;//窗体的弹出位置
private boolean mUseRadius =true;//是否使用圆角效果
private int mWindowWidth=-1;//窗体宽度(px),-1代表外界并未设置,直接使用默认设置
private int mWindowHeight=-1;//窗体高度(px)
public PopupDialog(@NonNull Context context) {
super(context);
}
public PopupDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
protected PopupDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
private int getContentLayoutId(){
if(mContentLayoutId<=0){
return DEFAULT_CONTENT_LAYOUT;
}
return mContentLayoutId;
}
//设置内容布局的layout
protected void setContentLayout(@LayoutRes int contentLayoutId){
mContentLayoutId=contentLayoutId;
}
//设置内容布局的layout
protected void setContentLayout(View contentLayout){
this.mContentLayout=contentLayout;
}
//设置窗体的弹出位置
protected void setWindowGravity(int gravity){
this.mGravity=gravity;
}
//是否使用圆角特性
protected void setUseRadius(boolean useRadius){
this.mUseRadius=useRadius;
}
//设置窗体宽度(px)
protected void setWindowWidth(int width){
this.mWindowWidth=width;
}
//设置窗体高度(px)
protected void setWindowHeight(int height){
this.mWindowHeight=height;
}
/**
* 生成窗体配置
*/
private void configWindow(){
Window window=getWindow();
if(window!=null){
WindowManager.LayoutParams params=window.getAttributes();
params.gravity= mGravity;
configWindowBackground(window);//配置窗体背景
configWindowLayoutParams(window,params);//设置窗体布局参数
configWindowAnimations(window);//配置动画效果
}
}
//配置窗体布局参数
private void configWindowLayoutParams(Window window, WindowManager.LayoutParams params){
params.gravity= mGravity;
if(mGravity== Gravity.LEFT||mGravity== Gravity.RIGHT){
params.width= getWidthParams(WindowManager.LayoutParams.WRAP_CONTENT);
params.height=getHeightParams(WindowManager.LayoutParams.MATCH_PARENT);
}else if(mGravity== Gravity.TOP||mGravity== Gravity.BOTTOM){
params.width= getWidthParams(WindowManager.LayoutParams.MATCH_PARENT);
params.height=getHeightParams(WindowManager.LayoutParams.WRAP_CONTENT);
}else{
params.width= getWidthParams(WindowManager.LayoutParams.WRAP_CONTENT);
params.height=getHeightParams(WindowManager.LayoutParams.WRAP_CONTENT);
}
window.setAttributes(params);
}
//获取宽度布局参数(取决于外界是否设置了宽度)
private int getWidthParams(int defaultParams){
if(mWindowWidth>=0){//此时宽度已被赋值
return mWindowWidth;
}
return defaultParams;
}
//获取高度布局参数(取决于外界是否设置了高度)
private int getHeightParams(int defaultParams){
if(mWindowHeight>=0){//此时高度已被赋值
return mWindowHeight;
}
return defaultParams;
}
//配置动画效果
private void configWindowAnimations(Window window){
switch(mGravity){
case Gravity.LEFT:
window.setWindowAnimations(R.style.LeftDialogAnimation);
break;
case Gravity.RIGHT:
window.setWindowAnimations(R.style.RightDialogAnimation);
break;
case Gravity.CENTER:
//从中心弹出使用默认动画,不作额外处理
break;
case Gravity.TOP:
window.setWindowAnimations(R.style.TopDialogAnimation);
break;
case Gravity.BOTTOM:
default:
window.setWindowAnimations(R.style.BottomDialogAnimation);
break;
}
}
//配置窗体背景
private void configWindowBackground(Window window){
if(!mUseRadius){
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_normal);
return;
}
switch(mGravity){
case Gravity.LEFT:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_left);
break;
case Gravity.RIGHT:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_right);
break;
case Gravity.CENTER:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_center);
break;
case Gravity.TOP:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_top);
break;
case Gravity.BOTTOM:
default:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_bottom);
break;
}
}
//配置主内容布局
private void configContentView(){
if(mContentLayout!=null){//优先使用View作为内容布局
setContentView(mContentLayout);
}else{
setContentView(getContentLayoutId());
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
configContentView();
configWindow();
}
}
package cn.com.founder.arcgislib.nonavi.widget.popup;
import android.content.Context;
import android.content.DialogInterface;
import android.view.Gravity;
import android.view.View;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/4/2 10:27
* EMail:luo_shaopeng@founder.com.cn
* Description:类似popup的dialog--辅助类
*/
public class PopupLayout {
private PopupDialog mPopupDialog;//内部使用的Dialog
private static DismissListener mDismissListener;//监听弹出窗口的消失事件
public static int POSITION_LEFT= Gravity.LEFT;//从最左侧弹出
public static int POSITION_RIGHT= Gravity.RIGHT;//右侧
public static int POSITION_CENTER= Gravity.CENTER;//从中间浮现
public static int POSITION_TOP= Gravity.TOP;//从顶部弹出
public static int POSITION_BOTTOM= Gravity.BOTTOM;//从底部弹出
public PopupLayout(Context context, View contentView){
mPopupDialog=new PopupDialog(context);
mPopupDialog.setContentLayout(contentView);
initListener();
}
// /**
// * 初始化PopLayout
// * @param context
// * @param contentLayoutId 内容布局Id
// */
// public PopupLayout init(Context context, @LayoutRes int contentLayoutId){
// PopupLayout popupLayout=new PopupLayout();
// mPopupDialog=new PopupDialog(context);
// mPopupDialog.setContentLayout(contentLayoutId);
// popupLayout.initListener();
// return popupLayout;
// }
//
// /**
// * 初始化PopLayout
// * @param context
// * @param contentView 内容布局
// */
// public PopupLayout init(Context context, View contentView){
// PopupLayout popupLayout=new PopupLayout();
// mPopupDialog=new PopupDialog(context);
// mPopupDialog.setContentLayout(contentView);
// initListener();
// return popupLayout;
// }
//初始化Dialog监听器
private void initListener(){
mPopupDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if(mDismissListener!=null){
mDismissListener.onDismiss();
}
}
});
}
/**
* 设置是否使用圆角特性
*/
public void setUseRadius(boolean useRadius){
if(mPopupDialog!=null){
mPopupDialog.setUseRadius(useRadius);
}
}
/**
* 默认从底部弹出
*/
public void show(){
show(POSITION_BOTTOM);
}
/**
* 从指定位置弹出/显示
* @param position 指定位置
*/
public void show(int position){
if(mPopupDialog==null){
return;
}
mPopupDialog.setWindowGravity(position);
mPopupDialog.show();
}
public boolean isShowing(){
if(mPopupDialog==null){
return false;
}
return mPopupDialog.isShowing();
}
/**
* @param isCancel 是否取消
*/
public void setCanceledOnTouchOutside(boolean isCancel){
mPopupDialog.setCanceledOnTouchOutside(isCancel);
}
/**
* @param isCancel 是否取消
*/
public void setCancelable(boolean isCancel){
mPopupDialog.setCancelable(isCancel);
}
/**
* 设置弹出布局的高度
* @param height 高度
* @param dpMode 是否以dp为单位
*/
public void setHeight(int height,boolean dpMode){
if(dpMode){
mPopupDialog.setWindowHeight(dp2Px(mPopupDialog.getContext(),height));
}else{
mPopupDialog.setWindowHeight(height);
}
}
/**
* 设置弹出布局的宽度
* @param width 宽度
* @param dpMode 是否以dp为单位
*/
public void setWidth(int width,boolean dpMode){
if(dpMode){
mPopupDialog.setWindowWidth(dp2Px(mPopupDialog.getContext(),width));
}else{
mPopupDialog.setWindowWidth(width);
}
}
/**
* 隐藏弹出布局(不会销毁弹出布局),不会触发DismissListener
* 建议使用dismiss()方法
*/
public void hide(){
if(mPopupDialog!=null){
mPopupDialog.hide();
}
}
/**
* 隐藏弹出布局(同时会销毁弹出布局,释放资源),建议使用
* 注意,在Activity退出时必须使用该方法销毁弹出布局,释放资源
*/
public void dismiss(){
if(mPopupDialog!=null){
mPopupDialog.dismiss();
}
}
/**
* 设置弹出布局消失的监听器
* @param dismissListener 监听器
*/
public void setDismissListener(DismissListener dismissListener){
mDismissListener=dismissListener;
}
//监听弹出窗口消失事件的监听器
public interface DismissListener{
void onDismiss();
}
/**
* dp转px
*/
private static int dp2Px(Context context, int dp) {
if (context == null) {
return 0;
}
return (int)(dp * context.getResources().getDisplayMetrics().density);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment