精华内容
下载资源
问答
  • // // MKMapView+XExpMapView.h // xpmobile // // Created by xpeng on 2021/11/9. // #import <MapKit/MapKit.h>...@property(nonatomic,assign) int zoomLevel; - (void)setCenterCoordinate:(CLLoc
    //
    //  MKMapView+XExpMapView.h
    
    #import <MapKit/MapKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface MKMapView (XExpMapView)
    @property(nonatomic,assign) int zoomLevel;
    - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
        zoomLevel:(NSUInteger)zoomLevel
        animated:(BOOL)animated;
    @end
    
    @implementation MKMapView (XExpMapView)
    #define MERCATOR_OFFSET 268435456
    #define MERCATOR_RADIUS 85445659.44705395
    
    @dynamic zoomLevel;
    #pragma mark -
    #pragma mark Map conversion methods
    -(int)zoomLevel{
        return 21-round(log2(self.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * self.bounds.size.width)));
    }
    
    - (double)longitudeToPixelSpaceX:(double)longitude
    {
        return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0);
    }
    
    - (double)latitudeToPixelSpaceY:(double)latitude
    {
        return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI / 180.0)) / (1 - sinf(latitude * M_PI / 180.0))) / 2.0);
    }
    
    - (double)pixelSpaceXToLongitude:(double)pixelX
    {
        return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI;
    }
    
    - (double)pixelSpaceYToLatitude:(double)pixelY
    {
        return (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI;
    }
    
    #pragma mark -
    #pragma mark Helper methods
    
    - (MKCoordinateSpan)coordinateSpanWithMapView:(MKMapView *)mapView
        centerCoordinate:(CLLocationCoordinate2D)centerCoordinate
        andZoomLevel:(NSUInteger)zoomLevel
    {
        // convert center coordiate to pixel space
        double centerPixelX = [self longitudeToPixelSpaceX:centerCoordinate.longitude];
        double centerPixelY = [self latitudeToPixelSpaceY:centerCoordinate.latitude];
        
        // determine the scale value from the zoom level
        NSInteger zoomExponent = 21 - zoomLevel;
        double zoomScale = pow(2, zoomExponent);
        
        // scale the map’s size in pixel space
        CGSize mapSizeInPixels = mapView.bounds.size;
        double scaledMapWidth = mapSizeInPixels.width * zoomScale;
        double scaledMapHeight = mapSizeInPixels.height * zoomScale;
        
        // figure out the position of the top-left pixel
        double topLeftPixelX = centerPixelX - (scaledMapWidth / 2);
        double topLeftPixelY = centerPixelY - (scaledMapHeight / 2);
        
        // find delta between left and right longitudes
        CLLocationDegrees minLng = [self pixelSpaceXToLongitude:topLeftPixelX];
        CLLocationDegrees maxLng = [self pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth];
        CLLocationDegrees longitudeDelta = maxLng - minLng;
        
        // find delta between top and bottom latitudes
        CLLocationDegrees minLat = [self pixelSpaceYToLatitude:topLeftPixelY];
        CLLocationDegrees maxLat = [self pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight];
        CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat);
        
        // create and return the lat/lng span
        MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
        return span;
    }
    
    #pragma mark -
    #pragma mark Public methods
    
    - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
        zoomLevel:(NSUInteger)zoomLevel
        animated:(BOOL)animated
    {
        // clamp large numbers to 21
        zoomLevel = MIN(zoomLevel, 21);
        
        // use the zoom level to compute the region
        MKCoordinateSpan span = [self coordinateSpanWithMapView:self centerCoordinate:centerCoordinate andZoomLevel:zoomLevel];
        MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);
        
        // set the region like normal
       // [self setRegion:region animated:animated];
        [self setRegion:[self regionThatFits:region] animated:YES];
    }
    
    - (void)setZoomLevel:(int)zoomLevel {
        [self setCenterCoordinate:self.centerCoordinate zoomLevel:zoomLevel animated:YES];
    }
    
    @end
    NS_ASSUME_NONNULL_END
    
    
    展开全文
  • 高德地图的数据库文件, 从高德官网爬取后入库的 增加了父级adcode; 表结构如下: CREATE TABLE `t_gaode_address` ( `ad_code` varchar(20) DEFAULT NULL COMMENT '高德的城市ID,身份证前6位', `city_code` varchar...
  • 高德地图中国行政区划基础数据,包含经纬度数据: CREATE TABLE `region` ( `id` varchar(20) NOT NULL, `name` varchar(100) DEFAULT NULL, `parent_id` varchar(20) DEFAULT NULL, `type` varchar(16) ...
  • `level` tinyint(4) DEFAULT NULL COMMENT '1:省(province )2:市(city) 3:区,县(district)4:街道(street)', `parent_id` int(10) DEFAULT NULL COMMENT '父id', `adcode` int(10) DEFAULT NULL COMMENT...
  • 于是自己花时间重新基于高德地图API接口采集了一份最新的城市区域数据。总计6万多条数据。数据格式如下: INSERT INTO `districts` (`id`, `name`, `pinyin`, `initials`, `letter`, `citycode`, `adcode`, `parent...
  • 百度、google、高德 地图比例尺功能实现(算法&&地图分辨率和zoomlevel之间的关系) 一、什么是比例尺? 比例尺是表示图上距离比实地距离缩小的程度,因此也叫缩尺。用公式表示为:比例尺=图上距离/...

    百度、google、高德 地图比例尺功能实现(算法&&地图分辨率和zoomlevel之间的关系)

     

     

    一、什么是比例尺?

    比例尺是表示图上距离比实地距离缩小的程度,因此也叫缩尺。用公式表示为:比例尺=图上距离/实地距离。

    例如地图上1厘米代表实地距离500千米,可写成:1∶50,000,000或写成:1/50,000,000。

    在当前移动端或是web端地图上显示:

    baidu   google

    图中的公里或英里数会随着黑条宽度的改变而改变,并且它的数值和地图当前区域的地图图层分辨率和缩放等级有关。浅显的来看,拿百度地图举例,百度地图移动端地图缩放等级分为:3-21,也就是19个等级,在同一缩放等级下,无论你移动到世界的每一个角落,比例尺的数值,公里\米 都是一样的。反之,googl地图就不一样,在同一缩放等级下,移动到世界不同的区域,显示的公里\ 英里 数值是不一样的,以赤道为中心,向两级延伸。google真正做到了球形的地球,而百度缩放到世界地图,你会看到整个地球是一张纸:

    先看看google地图:

    以下是百度地图:

     

     

     

    二、移动端的实现

    大家无论使用ios还是android的,会发现,三个地图api,有的提供了比例尺组件,有的没有,所以,只能我们自己来实现,接下来我就说一下如何实现,以百度地图android版(v2.1.2)为例。

    首先简单说一下实现原理:

    获取屏幕上两个点的位置坐标(中心点为起点,终点的x坐标为设计的比例尺最宽宽度),通过这两个点的图上坐标转换为真实经纬度,然后使用地图api提供的两点之间真是距离的函数,算出真实距离,即为当前缩放等级下,代表的大概比例尺数值。

    2-1,定义一个要显示比例尺数值的数组:

     

     
    1. public static final int[] SCALE = { 1, 20, 50, 100, 200, 500, 1000, 2000,

    2. 5000, 10000, 20000, 25000, 50000, 100000, 200000, 500000, 1000000,

    3. 2000000, 5000000 };

     

     

    2-2 在当前地图Activity中实现 MKMapViewListener 接口,覆盖其中的方法,并设置监听:

     

    mMapView.regMapViewListener(mBMapManager, this);

     

     
    1. @Override

    2. public void onClickMapPoi(MapPoi arg0) {

    3. }

    4.  
    5. @Override

    6. public void onGetCurrentMap(Bitmap arg0) {

    7. }

    8.  
     
    1. //当地图完成缩放,移动等动画效果后,回调此方法

    2. @Override

    3. public void onMapAnimationFinish() {

     
    1. showScaleView();

    2.  
    3. }

    4.  
    5. @Override

    6. public void onMapMoveFinish() {

    7. }

     

    2-3 声明并实例化组件:

     

     
    1. protected View mScaleView;

    2. protected int mScaleMaxWidth;

    3. protected int mScaleMaxHeight;

    4. protected TextView mScaleTextView;

    5. protected ImageView mScaleImageView;

     
    1. mScaleView = getLayoutInflater().inflate(R.layout.main_scale, null);

    2. LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,

    3. LayoutParams.WRAP_CONTENT);

    4. layoutParams.setMargins(10, 10, 0, 0);

    5. mScaleView.setLayoutParams(layoutParams);

    6.  
    7. mScaleTextView = (TextView) mScaleView.findViewById(R.id.scale_text);

    8. mScaleImageView = (ImageView) mScaleView.findViewById(R.id.scale_image);

     

    2-4 main_scale,xml

     

     
    1. <?xml version="1.0" encoding="utf-8"?>

    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    3. android:layout_width="wrap_content"

    4. android:layout_height="wrap_content"

    5. android:orientation="vertical" >

    6.  
    7. <TextView

    8. android:id="@+id/scale_text"

    9. android:layout_width="wrap_content"

    10. android:layout_height="wrap_content"

    11. android:layout_gravity="center"

    12. android:singleLine="true"

    13. android:textColor="@color/text_black" />

    14.  
    15. <ImageView

    16. android:id="@+id/scale_image"

    17. android:layout_width="match_parent"

    18. android:layout_height="wrap_content"

    19. android:background="@drawable/scale"

    20. android:contentDescription="@null" />

    21.  
    22. </LinearLayout>


    2-5,showScaleView()

     

     

     
    1. /** 计算两处经纬度的实际距离并换算成实际比例尺单位 */

    2. public void showScaleView() {

    3.  
    4. //获取设置默认屏幕宽度480

    5. int default_screen_width = this.getResources()

    6. .getDimensionPixelSize(R.dimen.default_screen_width);

    7. //获取设置默认屏幕高度800

    8. int default_screen_height = this.getResources()

    9. .getDimensionPixelSize(R.dimen.default_screen_height);

    10. //mScaleMaxWidth = 默认屏幕宽度四分之一

    11. mScaleMaxWidth = default_screen_width>>2;

    12. //mScaleMaxHeight = 默认屏幕高度二分之一

    13. mScaleMaxHeight = default_screen_height>>1;

    14.  
    15. //转换为起点的经纬度GeoPoint

    16. GeoPoint fromGeopoint = mMapView.getProjection().fromPixels(0,

    17. mScaleMaxHeight);

    18. //转换为终点的经纬度GeoPoint

    19. GeoPoint toGeopoint = mMapView.getProjection().fromPixels(

    20. mScaleMaxWidth, mScaleMaxHeight);

    21. //通过getDistance函数得出两点间的真实距离

    22. double distance = DistanceUtil.getDistance(fromGeopoint, toGeopoint);

    23.  
    24. String discripition = null;

    25. int dis = 0;

    26. int width = 20;

    27. //出于百度地图缩放最小为世界地图时,以纸的形式展现,这里强制规定如果zoomlevel=最高级

    28. //比例尺数值恒定wie:2000公里,黑条宽度恒定为52像素,缩放最大时同样的道理,如果是google

    29. //地图,不需要if和 else if

    30. if (mMapView.getZoomLevel() == 19) {

    31. dis = Constants.SCALE[1];

    32. width = 52;

    33. } else if (mMapView.getZoomLevel() == 3) {

    34. dis = Constants.SCALE[17];

    35. width = 80;

    36. } else {

    37.  
    38. //真实距离和数组中相近的两个值循环比较,以小值为准,得出规定好的比例尺数值赋值给dis

    39. for (int j = 1; j < Constants.SCALE.length; j++) {

    40. if (Constants.SCALE[j - 1] <= distance

    41. && distance < Constants.SCALE[j]) {

    42. dis = Constants.SCALE[j - 1];

    43. break;

    44. }

    45. }

    46. //比例尺黑条的宽度 =(dis*默认屏幕宽度四分之一)/真实的距离

    47. width = (int) (dis * mScaleMaxWidth / distance);

    48. }

    49.  
    50. //如果比例尺数值大于1000,则discripition = 2500 km(公里),否则 为 900 m(米)

    51. if (dis >= 1000) {

    52. discripition = dis / 1000 + getString(R.string.units_km);

    53. } else {

    54. discripition = dis + getString(R.string.units_m);

    55. }

    56.  
    57. //设置TextView组件要显示的比例尺数值

    58. mScaleTextView.setText(discripition);

    59. //设置比例尺黑条ImageView的的长度

    60. android.view.ViewGroup.LayoutParams lp = mScaleImageView

    61. .getLayoutParams();

    62. lp.width = width;

    63. mScaleImageView.setLayoutParams(lp);

    64.  
    65. }


    至此,代码部分就结束了,咱们看一下运行效果

     

     

    如果你想要实时的动态效果,也就是说双指触控到屏幕(缩放地图)时,(手指未离开)就不断变化比例尺,就不能写在onMapAnimationFinish回调函数内了,因为它不是实时调用,只有当每次动画结束后(双指也离开屏幕了),才会调用;那就覆盖onTouchEvent方法:

     

     
    1. @Override

    2. public boolean onTouchEvent(MotionEvent arg0) {

    3. showScaleView();

    4.  
    5. return super.onTouchEvent(arg0);

    6. }

    这样,每当手指触摸到屏幕,就会实时调用算法啦。不过看样子cpu应该会很累的。

     

     

    至于google和高德地图,把showScaleView()写在其地图缩放的回调函数内即可,google的好像是 onCameraChange();

     

     

    三、结尾

    到此,比例尺的功能就被我们自己实现了,这个算法不知道算不算严格的科学,但是至少应该不会差很多,如果谁有同样的兴趣,欢迎和我一起探讨噢。

     

    展开全文
  • 高德地图妲己语音

    千次阅读 2021-01-14 01:07:06
    高德地图妲己语音包是一款王者荣耀中的妲己智能语音导航,使用小妲己语音系统你可以听到妲己声音的导航,就像在玩游戏体验一样,给你别样的感觉体验,喜欢小妲己的不要错过这款语音包,快来下载。高德地图小妲己语音...

    高德地图妲己语音包是一款王者荣耀中的妲己智能语音导航,使用小妲己语音系统你可以听到妲己声音的导航,就像在玩游戏体验一样,给你别样的感觉体验,喜欢小妲己的不要错过这款语音包,快来下载。

    高德地图小妲己语音包部分内容:

    主人,要加油哦!

    我还需要一个语音来安慰我啊!?

    怎么啦?

    您的燃油不足

    为了您的安全,妲己已帮您自动刹车

    为什么你刚刚不说啊

    妲己刚刚说过了

    你刚刚怎么说的?

    我你我问你了吗?

    你说了吗?

    主人,要加油哦!

    主人,您的女友发来短信

    高德地图小妲己语音包功能

    采集数据及上线道路数据已覆盖全国所有城市,采集里程超过670万公里。

    百度地图POI(地图兴趣点)国内数据更新530万个,其中新增380万。

    室内图覆盖超过3,000座大型购物中心。智能景区伴游服务,已覆盖全国超过400个热门景区。

    高德地图小妲己语音包特色:

    1.语音识别ASR

    2.利用语音元素的特征值比对,找出可能正确的匹配词汇。是定义内容的对照,而不是翻译。

    3.是机率学的应用, 2012 年技术重大突破(DNN 深层神经网络)。每次辨识结果,返回信心度(confidence level)。

    4.独创的抗噪声和远场技术独创的抗噪声和远场技术,在语音识别前处理声音信号,有效分离噪音和混响,极大提高在户外、市内、车内等复杂环境下的语音识别率。

    5.独创的说话人识别和语音识别同步处理技术独创的说话人识别和语音识别同步处理技术,在语音识别的过程中,实时同步区分说话人,不仅提高系统效率,更能实现实时语音分析、说话人分析等功能。

    6.高识别率和识别效率我方基于最先进的深度学习算法模型,可实现在确保高准确率的实时识别情况下,系统保持高识别效率,大大降低系统成本。

    展开全文
  • Flutter集成高德地图

    千次阅读 2020-06-08 20:27:04
    Flutter集成高德地图引言高德开放平台创建应用获取 Android 安全码获取包名配置 key 和权限项目内集成安装包dynamic_page.dart 父页面map_choice.dart子页面FAQ64k引用限制结果 引言 Flutter 集成高德地图,部分资源...

    引言

    Flutter 集成高德地图,部分资源来源于网络,技术在不断更新,网上很多方法都过时了,筛选最优解决办法做一次总结。

    高德开放平台

    创建应用

    高德开放平台创建一个应用 。

    获取 Android 安全码

    我是Ubuntu20.04开发环境,进入目录

    scrutiny@scrutiny-CN15S:~/.android$ cd ~/.android/
    

    如果有 debug.keystone 输入以下命令查看调试安全码

    keytool -list -v -keystore debug.keystore
    

    在这里插入图片描述
    如果没有输入以下命令生成 debug.keystore 后再查看

    keytool -list -v -keystore "~/.android/debug.keystore" -alias androiddebugkey -storepass android -keypass android
    

    获取包名

    package name 在 android/app/build.gradle下查看,然后完成创建应用。
    在这里插入图片描述

    配置 key 和权限

    编辑 android/app/src/main/AndroidManifest.xml 文件

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.oblivion">
        <application
            android:name="io.flutter.app.FlutterApplication"
            //略···
            <activity
               	//略···
            </activity>
            <meta-data
                android:name="flutterEmbedding"
                android:value="2" />
            //第一步 name 是固定的,value 填高德地图提供的key
            <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="1391d54211e5425ad433c85187188e3e"/>
        </application>
        //第二步 在此处添加开放权限
        <!--允许程序打开网络套接字-->
        <uses-permission android:name="android.permission.INTERNET" />
        <!--允许程序设置内置sd卡的写权限-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!--允许程序获取网络状态-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!--允许程序访问WiFi网络信息-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!--允许程序读写手机状态和身份-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    </manifest>
    
    

    项目内集成

    安装包

    pubspec.yaml 新增配置,然后执行 flutter pub get 获取依赖包。

      # https://pub.flutter-io.cn/packages/amap_all_fluttify
      amap_all_fluttify: 0.15.1
      # https://github.com/Baseflow/flutter-permission-handler
      permission_handler: ^5.0.0+hotfix.9
      # https://github.com/PonnamKarthik/FlutterToast
      fluttertoast: ^4.0.0
    

    dynamic_page.dart 父页面

    import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:oblivion/pages/dynamic/map_choice.dart';
    
    class DynamicPage extends StatefulWidget {
      @override
      _DynamicPageState createState() => _DynamicPageState();
    }
    
    class _DynamicPageState extends State<DynamicPage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(child: MapChoicePoint((point) {
            debugPrint(point.toString());
          })),
        );
      }
    }
    

    map_choice.dart子页面

    import 'package:flutter/material.dart';
    import 'package:amap_all_fluttify/amap_all_fluttify.dart';
    import 'package:flutter/services.dart';
    import 'package:permission_handler/permission_handler.dart';
    import 'package:fluttertoast/fluttertoast.dart';
    /**
     * 地图选择点控件
     */
    class MapChoicePoint extends StatefulWidget {
      /**
       * 选择点后回调事件
       */
      final Function onChoicePoint;
      MapChoicePoint(this.onChoicePoint);
      @override
      _MapChoicePointState createState() => _MapChoicePointState();
    }
    
    class _MapChoicePointState extends State<MapChoicePoint>
        with SingleTickerProviderStateMixin {
      //----属性----
    
      //地图控制器
      AmapController _amapController;
      //选择的点
      Marker _markerSelect;
      //搜索出来之后选择的点
      Marker _markerSeached;
      //所在城市
      String city;
      //搜索框文字控制器
      TextEditingController _serachController;
      //自定义marker点图标图片路径
      //Uri _imgUri = Uri.parse('images/position.png');
    
      //----方法----
    
      /**
       * 获取权限
       */
      Future<bool> _requestPermission() async {
        final permissions = await await Permission.location.status;
        if (permissions.isUndetermined) {
          return true;
        } else {
          Fluttertoast.showToast(
              msg: "需要定位权限",
              toastLength: Toast.LENGTH_SHORT,
              gravity: ToastGravity.CENTER,
              timeInSecForIosWeb: 1,
              backgroundColor: Colors.red,
              textColor: Colors.white,
              fontSize: 16.0
          );
          return false;
        }
      }
    
      /**
       * 根据搜索条件选出想要的点
       */
      Future _openModalBottomSheet() async {
        //收起键盘
        FocusScope.of(context).requestFocus(FocusNode());
        //根据关键字及城市进行搜索
        final poiList = await AmapSearch.searchKeyword(
          _serachController.text,
          city: city,
        );
        List<Map> points = [];
        //便利拼接信息
        for (var item in poiList) {
          points.add({
            'title': await item.title,
            'address': await item.adName + await item.address,
            'position': await item.latLng,
          });
        }
        //弹出底部对话框并等待选择
        final option = await showModalBottomSheet(
            context: context,
            builder: (BuildContext context) {
              return points.length > 0
                  ? ListView.builder(
                itemCount: points.length,
                itemBuilder: (BuildContext itemContext, int i) {
                  return ListTile(
                    title: Text(points[i]['title']),
                    subtitle: Text(points[i]['address']),
                    onTap: () {
                      Navigator.pop(context, points[i]);
                    },
                  );
                },
              )
                  : Container(
                  alignment: Alignment.center,
                  padding: EdgeInsets.all(40),
                  child: Text('暂无数据'));
            });
    
        if (option != null) {
          LatLng selectlatlng = option['position'];
          //将地图中心点移动到选择的点
          _amapController.setCenterCoordinate(selectlatlng);
          //删除原来地图上搜索出来的点
          if (_markerSeached != null) {
            _markerSeached.remove();
          }
          //将搜索出来的点显示在界面上 --此处不能使用自定义图标的marker,使用会报错,至今也没有解决
          _markerSeached = await _amapController.addMarker(MarkerOption(
            latLng: selectlatlng,
          ));
        }
      }
    
      @override
      void initState() {
        super.initState();
        _serachController = TextEditingController();
      }
    
      @override
      void dispose() {
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Stack(
          alignment: AlignmentDirectional.topCenter,
          children: <Widget>[
            AmapView(
              // 地图类型 (可选)
              mapType: MapType.Standard,
              // 是否显示缩放控件 (可选)
              showZoomControl: true,
              // 是否显示指南针控件 (可选)
              showCompass: true,
              // 是否显示比例尺控件 (可选)
              showScaleControl: true,
              // 是否使能缩放手势 (可选)
              zoomGesturesEnabled: true,
              // 是否使能滚动手势 (可选)
              scrollGesturesEnabled: true,
              // 是否使能旋转手势 (可选)
              rotateGestureEnabled: true,
              // 是否使能倾斜手势 (可选)
              tiltGestureEnabled: true,
              // 缩放级别 (可选)
              zoomLevel: 16,
              // 中心点坐标 (可选)
              // centerCoordinate: LatLng(39, 116),
              // 标记 (可选)
              markers: <MarkerOption>[],
              // 标识点击回调 (可选)
              onMarkerClicked: (Marker marker) async {
                if (_markerSeached == null) {
                  return;
                }
                //获取点击点的位置
                var location = await marker.location;
                var lon = location.longitude;
                var lat = location.latitude;
                //获取搜索点的位置
                var slocation = await _markerSeached.location;
                var slon = slocation.longitude;
                var slat = slocation.latitude;
                //比较位置
                if (lon == slon && lat == slat) {
                  //移除原来的点
                  if (_markerSeached != null) {
                    _markerSeached.remove();
                  }
                  if (_markerSelect != null) {
                    _markerSelect.remove();
                  }
                  //画上新的点
                  _markerSelect = await _amapController.addMarker(MarkerOption(
                      latLng: location,
                      //iconUri: _imgUri,
                      imageConfig: createLocalImageConfiguration(context),
                      width: 64,
                      height: 64,
                      anchorV: 0.7,
                      anchorU: 0.5));
                }
              },
              // 地图点击回调 (可选)
              onMapClicked: (LatLng coord) async {
    
                if (_amapController != null) {
                  //移除原来的点
                  if (_markerSelect != null) {
                    _markerSelect.remove();
                  }
                  if (_markerSeached != null) {
                    _markerSeached.remove();
                  }
                  //画上新的点
                  _markerSelect = await _amapController.addMarker(MarkerOption(
                      latLng: coord,
                      //iconUri: _imgUri,
                      imageConfig: createLocalImageConfiguration(context),
                      width: 64,
                      height: 64,
                      anchorV: 0.7,
                      anchorU: 0.5));
                  widget.onChoicePoint(coord);
                }
              },
              onMapMoveStart: (MapMove move) {},
              // 地图创建完成回调 (可选)
              onMapCreated: (controller) async {
                _amapController = controller;
                //申请权限
                if (await _requestPermission()) {
                  //获取所在城市
                  final location = await AmapLocation.fetchLocation();
                  city = await location.city;
                  //显示自己的定位
                  await controller.showMyLocation(MyLocationOption(show: true));
                  // await initSerach();
                }
              },
            ),
            Container(
              margin: EdgeInsets.all(20),
              width: MediaQuery.of(context).size.width,
              height: 46,
              decoration: BoxDecoration(color: Colors.white),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.all(8),
                    width: MediaQuery.of(context).size.width - 20 - 80,
                    child: TextField(
                      controller: _serachController,
                      decoration: InputDecoration(border: InputBorder.none),
                      inputFormatters: <TextInputFormatter>[
                        LengthLimitingTextInputFormatter(10) //限制长度
                      ],
                    ),
                  ),
                  IconButton(
                      icon: Icon(Icons.search), onPressed: _openModalBottomSheet)
                ],
              ),
            )
          ],
        );
      }
    }
    

    FAQ

    64k引用限制

    报错: Error:The number of method references in a .dex file cannot exceed 64K.
    解决方法不唯一,我选择的是multidex 配置,在我们配置应用程序的构建过程中,生成多个DEX文件。

    android/app/build.gradle 文件最下方 defaultConfig 中添加 multiDexEnabled true。

    defaultConfig {
            // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
            applicationId "com.example.oblivion"
            minSdkVersion 16
            targetSdkVersion 29
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
            # 追加
            multiDexEnabled true
        }
    

    android/app/build.gradle 文件最下方 dependencies 中添加如下代码:

    dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        # 追加
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.2.0'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
        implementation 'com.android.support:multidex:1.0.3'
    }
    

    运行结果

    在这里插入图片描述

    展开全文
  • 高德地图 zoom地图级别无效问题

    千次阅读 2020-05-15 14:25:03
    zoom: 10, //设置地图显示的缩放级别 center: [116.397428, 39.90923],//设置地图中心点坐标 layers: [new AMap.TileLayer.Satellite()], //设置图层,可设置成包含一个或多个图层的数组 mapStyle: 'amap://...
  • 2.3高德地图环境 2.4腾讯地图环境 3、工程配置 3.1 添加jar包 3.2 添加so文件 3.3 AndroidMainfest.xml配置 4.百度地图与定位 5.高德地图与定位 6.腾讯地图与定位 1、开发背景 由于公司在开发安卓项目时,需要用到...
  • 高德地图API实现区域立体效果

    千次阅读 2020-11-12 16:30:45
    高德地图API实现区域立体效果初衷区域掩膜垂面Wall区域掩膜与垂面Wall相结合,构建区域立体效果最后 初衷 在利用高德地图API做项目的过程中遇到需只显示一个区域的地图,并且具有立体效果,经过 百度,谷歌等等搜索...
  • 请教 高德地图绘制行政区划边界

    千次阅读 2020-12-30 04:49:16
    该楼层疑似违规已被系统折叠隐藏此楼查看此楼高德地图绘制行政区划边界 如何能具体点 比如我要绘制长安区的 为何会定位到石家庄长安区 而不是西安的长安区addBeiJing();function addBeiJing() {//加载行政区划插件A...
  • 瓦片地图首先解释一下什么是瓦片地图,...项目需求项目使用的是高德地图,基本的操作可以参考官方文档,然后需要叠加自己的瓦片地图。在官方文档中找了好久,终于在绘制面_绘制瓦片图层这一节中找到了相应的方法。主...
  • 高德地图—js.api

    千次阅读 2019-03-25 16:35:20
    我们通过进入示例中心 JS API /plugin的加载 这段挺复杂的。 https://lbs.amap.com/api/javascript-api/guide/abc/load ...地图元素结构 地图容器 Container 即在准备阶段所创建的指定了id的div对象,这个div...
  • var map = new AMap.Map("container", { resizeEnable: true, center: [116.397428, 39.90923],//地图中心点 zoom: 13 //地图显示的缩放级别 }); //构造路线导航类 var driving = new AMap.Driving({ map: map, ...
  • vue 高德地图的使用

    2021-02-03 15:51:39
    AMap.plugin("AMap.DistrictSearch", function () { // 创建行政区查询对象 var district = new AMap.DistrictSearch({ // 返回行政区边界坐标等具体信息 extensions: "all", // 设置查询行政区级别为 区 level: ...
  • 高德地图+Echarts+Vue

    千次阅读 2020-12-01 09:58:43
    @[TOC]高德地图+Echarts+Vue 高德地图+Echarts+Vue 先上效果图 1.创建后vue项目后下载echarts和高德地图插件 npm install amap-echarts npm install echarts 2.在index.html引入高德地图js <script type="text/...
  • python 高德地图交通态势爬取(存入mysql)

    千次阅读 热门讨论 2020-05-09 14:05:11
    高德Web服务API提供了交通态势的http接口,使用时分为以下3个过程: 第一步,申请”Web服务API接口”密钥(Key); 第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送; 第三步,接收HTTP请求返回...
  • 近期博主在做地理数据可视化方面的研究,pyecharts提供了较好的工具,里面提供了很多图形,尤其是Map和Geo这两种图,一种是地图,一种是地理信息图。pyecharts的基础还是echart,echart是百度地图开源的一个数据可视...
  • 打开显示一片淡蓝色,缩放...下面代码有什么错误吗aMap.open({rect : {x : 0,y : 0,w : api.winWidth,h : api.frameHeight},showUserLocation : true, //显示用户位置zoomLevel : 15,fixedOn : api.frameName,fixed...
  • 高德地图路径规划

    2021-04-08 09:22:32
    #高德地图路径规划一、要实现的效果二、index.html引入js三、template代码四、script代码五、style六、图标 一、要实现的效果 包含驾车、公交、骑行、步行多种交通方式,如图所示: 二、index.html引入js <...
  • 高德地图绘制区域边界线

    千次阅读 2020-12-21 06:12:21
    地图开发中,经常需要对某个区域进行边界线的绘制,以起到区分和突出强调的作用。通过高德JS API中的行政区查询服务(AMap.DistrictSearch)可便捷的拿到目标区域的边界坐标点进行渲染。以广东省为目标区域,绘制...
  • 利用高德地图行政区域API获得坐标列表2.将坐标列表绘制在谷歌地图上【因为高德地图和国内的谷歌地图都是采用GCJ02坐标系,所有误差很小,可以不进行坐标误差转换】注意点:1.用百度地图的API来绘制行政区域,不太...
  • 引言最近项目有在用高德地图,顺便记录下一些知识。项目需要做地图上显示一个车辆位置,这个位置需要波纹扩散效果,这个高德地图也提供了demo,但是看着效果不算很棒,比起iOS平台的要差老远了。Android平台下载了...
  • ArcGIS JS API使用 百度高德 地图

    千次阅读 2019-02-01 15:17:37
     1.2 定义高德图层类 define(["dojo/_base/declare", "esri/geometry/Extent", "esri/SpatialReference", "esri/geometry/Point", "esri/layers/TileInfo", "esri/layers/TiledMapServiceLayer"], ...
  • 高德地图省市县sql

    2019-07-19 15:01:13
    高德地图省市县sql,下载后数据库运行sql即可,内包含省市县名称、编码、经度纬度、区号、相互之间的关联 CREATE TABLE `region_amap` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `adcode` varchar(20) COLLATE ...
  • 高德地图运用场景:先获取本机经纬度 ,从服务端获取周围的小区和停车场的经纬度,通过服务端返回的type赋值给大头针的title来判断是小区还是停车场1,首先实例化地图#import #import #import #import @property ...
  • drawMarker(res) { let markerContent; let zIndex; for (let i = 0;... } } // 将 markers 添加到地图 this.$nextTick(() => { this.map.add(this.markerList); }); this.map.setFitView(this.markerList); },
  • vue3高德地图

    千次阅读 2020-09-22 13:08:56
    /**此对象用于表示地图、覆盖物、叠加层上的各种鼠标事件返回,包含以下字段: 高德的事件说明文档有问题; 不是 LngLat 类,而是一个普通对象; **/ export class MapsEvent { /** 发生事件时光标所在处的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,474
精华内容 589
关键字:

高德地图level