久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    百度地圖查詢視野范圍內(nèi)的建筑物

     集微筆記 2013-10-21

       根據(jù)用戶移動(dòng)地圖的位置,顯示在視野范圍內(nèi)的建筑物,簡(jiǎn)單的思路是,添加地圖監(jiān)聽(tīng),當(dāng)?shù)貓D移動(dòng)結(jié)束之后,計(jì)算出當(dāng)前屏幕四個(gè)角的GeoPoint,根據(jù)這4個(gè)點(diǎn),通過(guò)mysql的spatial中的函數(shù),完成在此范圍內(nèi)的建筑物的查詢。

    1.   mysql spatial介紹

      從MySQL4.0開(kāi)始加入了Spatial擴(kuò)展功能,實(shí)現(xiàn)了OpenGIS規(guī)定的幾何數(shù)據(jù)類型,在SQL中的簡(jiǎn)單空間運(yùn)算。但是MySQL對(duì)空間查詢的支持不夠完善,要進(jìn)行復(fù)雜的空間運(yùn)算,建議使用postgreSQL數(shù)據(jù)庫(kù)的postGIS。

        下圖是MySQL Spatial接口及類的結(jié)構(gòu)(有背景顏色的框代表接口):

        有關(guān)mysql的詳細(xì)介紹,可以參考一下鏈接中的文章。

    l  官方參考文檔(中文):

    http://dev./doc/refman/5.1/zh/spatial-extensions-in-mysql.html#mysql-spatial-datatypes

    l  官方參考文檔(英文):

    http://dev./doc/refman/5.0/en/spatial-extensions.html

    關(guān)于hibernate支持mysql-spatial

    http://blog.csdn.net/b10090120/article/details/8698787

    http://www./tutorial.html

    拓展mysqlspatial函數(shù):

    1)  空間中的點(diǎn)是否相等

    01 DELIMITER $$
    02    
    03 CREATE DEFINER = 'smart'@'localhost'
    04 FUNCTION ArePointsEqual(p1 POINT,
    05                         p2POINT
    06                         )
    07 RETURNS TINYINT(1)
    08 DETERMINISTIC
    09 NO SQL
    10 BEGIN
    11   RETURN IsZero(x(p1) -x(p2)) AND IsZero(y(p1) - y(p2));
    12 END
    13 $$
    14    
    15 DELIMITER ;

    2)  查找區(qū)域的中心點(diǎn)

    01 USE smartu;
    02    
    03 DELIMITER $$
    04    
    05 CREATE DEFINER = 'smart'@'localhost'
    06 FUNCTION GetCenterPoint(g GEOMETRY)
    07 RETURNS POINT
    08 DETERMINISTIC
    09 NO SQL
    10 BEGIN
    11   DECLARE envelope  POLYGON;
    12   DECLARE sw, ne    POINT; #South-West and North-East points
    13   DECLARE lat, lng  DOUBLE;
    14    
    15   SET envelope =exteriorring(Envelope(g));
    16   SET sw =pointn(envelope, 1);
    17   SET ne =pointn(envelope, 3);
    18   SET lat = x(sw) + (x(ne)- x(sw)) / 2;
    19   SET lng = y(sw) + (y(ne)- y(sw)) / 2;
    20   RETURN POINT(lat, lng);
    21 END
    22 $$
    23    
    24 DELIMITER ;

    3)  LineN

    01 USE smartu;
    02    
    03 DELIMITER $$
    04    
    05 CREATE DEFINER = 'smart'@'localhost'
    06 FUNCTION LineN(ls LINESTRING,
    07                INT
    08                )
    09 RETURNS LINESTRING
    10 DETERMINISTIC
    11 NO SQL
    12 BEGIN
    13   IF n >= numpoints(ls)THEN
    14     RETURN NULL;
    15   END IF;
    16   RETURNLineString(pointn(ls, n), pointn(ls, n + 1));
    17 END
    18 $$
    19    
    20 DELIMITER ;

    4)  計(jì)算兩點(diǎn)間的空間距離

    01 USE smartu;
    02    
    03 DELIMITER $$
    04    
    05 CREATE DEFINER = 'smart'@'localhost'
    06 FUNCTION DISTANCE(lat1 DOUBLE,
    07                   lon1DOUBLE,
    08                   lat2DOUBLE,
    09                   lon2DOUBLE
    10                   )
    11 RETURNS DOUBLE
    12 DETERMINISTIC
    13 NO SQL
    14 COMMENT 'counts distance (km) between 2 points on Earth surface'
    15 BEGIN
    16   DECLARE dtor DOUBLEDEFAULT 57.295800;
    17    
    18   RETURN (6371 *acos(sin(lat1 / dtor) * sin(lat2 / dtor) +
    19   cos(lat1 / dtor) *cos(lat2 / dtor) *
    20   cos(lon2 / dtor - lon1 /dtor)));
    21 END
    22 $$
    23    
    24 DELIMITER ;

    5)  是否為0

    01 USE smartu;
    02    
    03 DELIMITER $$
    04    
    05 CREATE DEFINER = 'smart'@'localhost'
    06 FUNCTION IsZero(n DOUBLE)
    07 RETURNS TINYINT(1)
    08 DETERMINISTIC
    09 NO SQL
    10 BEGIN
    11   DECLARE epsilon DOUBLEDEFAULT 0.00000000001;
    12    
    13   RETURN (abs(n) <=epsilon);
    14 END
    15 $$
    16    
    17 DELIMITER ;

    2.  項(xiàng)目前臺(tái)、后臺(tái)的實(shí)現(xiàn)

    1)  項(xiàng)目后臺(tái)實(shí)現(xiàn)

    l  數(shù)據(jù)庫(kù)設(shè)計(jì)

    01 --創(chuàng)建表
    02 createtable smart_u_convenience_item_spatial(
    03     item_spatial_id varchar(36) not null,
    04     location point not null,
    05     latitude varchar(20),
    06     longitude varchar(20),
    07     convenience_item_code varchar(500),
    08     convenience_item_name varchar(500),
    09     primary key (`item_spatial_id`),
    10     spatial key `sp_index`(location)
    11 )ENGINE=MyISAM;
    12 --往表中插入數(shù)據(jù)
    13 INSERTINTO smart_u_convenience_item_spatial
    14 SELECTt.convenience_item_id
    15      , PointFromText(concat('POINT(',t.item_latitude, ' ', t.item_longitude, ')'))
    16      , t.item_latitude
    17      , t.item_longitude
    18      , t.convenience_item_code
    19      , t.convenience_item_name
    20    from smart_u_convenience_item t;

    l  后臺(tái)代碼使用到的查詢點(diǎn)的sql

    01 SELECT *
    02 FROM
    03   (SELECT *
    04    FROM
    05     smart_u_convenience_item t
    06    WHERE
    07      t.convenience_item_idIN
    08     (SELECTs.item_spatial_id
    09        FROM
    10         smart_u_convenience_item_spatial s
    11        WHERE
    12         intersects(location,
    13                    geomfromtext(concat('POLYGON((', 3.9921123E7, ' ', 1.16365462E8,
    14                                                 ',', 3.9921123E7, ' ', 1.16441881E8,
    15                                                ',', 3.9879484E7, ' ', 1.16441881E8,
    16                                                ',', 3.9879484E7, ' ', 1.16365462E8,
    17                                                  ',', 3.9921123E7, ' ', 1.16365462E8,'))'))))) t
    18 ORDER BY
    19  item_longitude ASC

    2)  前臺(tái)設(shè)計(jì)

    001 MKMapViewListener mapViewListener = new MKMapViewListener() {
    002    
    003          @Override
    004          public void onMapMoveFinish() {
    005             // 此處可以實(shí)現(xiàn)地圖移動(dòng)完成事件的狀態(tài)監(jiān)聽(tīng)
    006             Log.e(TAG,"mapMoveFinish");
    007            BsnsDisAllActivity.this.getBsnsDisInfo(BsnsDisAllActivity.this.getGeoPointMap());           
    008          }
    009    
    010          @Override
    011          public void onClickMapPoi(MapPoipoi) {
    012             Log.e(TAG,poi.geoPt.getLatitudeE6()+","+poi.geoPt.getLongitudeE6());         
    013          }
    014    
    015          @Override
    016          public void onGetCurrentMap(Bitmaparg0) {
    017             Log.e(TAG,"onGetCurrentMap");
    018              
    019          }
    020    
    021          @Override
    022          public void onMapAnimationFinish(){
    023             Log.e(TAG,"onMapAnimationFinish");
    024            BsnsDisAllActivity.this.getBsnsDisInfo(BsnsDisAllActivity.this.getGeoPointMap());
    025          }
    026       };
    027       mMapView.regMapViewListener(app.mBMapManager,mapViewListener);
    028    
    029 private Map<String,Double> getGeoPointMap(){
    030    
    031          Projectionprojection = mMapView.getProjection();
    032    
    033          Map<String,Double>polygon = newHashMap<String,Double>();
    034          GeoPointtop = projection.fromPixels(0, 0);
    035          polygon.put("top_x",(double) top.getLatitudeE6());
    036          polygon.put("top_y",(double)top.getLongitudeE6());
    037          GeoPointright = projection.fromPixels(mMapView.getWidth(), 0);
    038          polygon.put("right_x",(double)right.getLatitudeE6());
    039          polygon.put("right_y",(double)right.getLongitudeE6());
    040          GeoPointdown = projection.fromPixels(mMapView.getWidth(), mMapView.getHeight());
    041          polygon.put("down_x",(double)down.getLatitudeE6());
    042          polygon.put("down_y",(double)down.getLongitudeE6());
    043          GeoPointleft = projection.fromPixels(0, mMapView.getHeight());
    044          polygon.put("left_x",(double)left.getLatitudeE6());
    045          polygon.put("left_y",(double)left.getLongitudeE6());
    046           
    047          return polygon;
    048       }
    049    
    050    
    051 private voidgetBsnsDisInfo(Map<String,Double>polygon){
    052           final Map<String,Double> tPolygon =polygon;
    053          new Thread(){
    054             public void run() {
    055                 try{
    056                    List<OrderByEntity>orderByEntity = new ArrayList();
    057                    OrderByEntityorder = newOrderByEntity();
    058                    order.setOrderCol("item_longitude");
    059                    order.setOrderType("asc");
    060                    orderByEntity.add(order);
    061    //              OrderByEntityorder2 = new OrderByEntity();
    062    //              order.setOrderCol("item_latitude");
    063    //              order.setOrderType("asc");
    064    //              orderByEntity.add(order2);
    065     
    066                    ConvenienceItemAckEntityack = SUService.getInstance().getMapBsns(app.nowUser, tPolygon, orderByEntity, null, null);
    067                    Log.i(TAG,ack.getAckCode().toString());
    068                    Log.i(TAG,ack.getAckMsg().toString());
    069                   Message msg = new Message();
    070                    if(ack.getAckCode().toString().indexOf("INFO") != -1){
    071                       msg.what = RESULT_BSNS_CAT;
    072                    }else{
    073                       msg.what = RESULT_ERROR;
    074                    }
    075                    msg.obj = ack;
    076                    myHandler.sendMessage(msg);
    077                 }catch(Exception e){
    078                     
    079                 }
    080                  
    081             };
    082          }.start();
    083       }
    084         
    085        Handler myHandler = new Handler(){
    086          public void handleMessage(Messagemsg) {
    087             switch (msg.what) {
    088             case RESULT_BSNS_CAT:
    089                 ConvenienceItemAckEntityack = (ConvenienceItemAckEntity)msg.obj;
    090                 pinItemMark(ack.getResults());
    091                 break;
    092    
    093             default:
    094                 break;
    095             }
    096          };
    097       };
    098        
    099       private voidpinItemMark(List<ConvenienceItemEntity> itemList){
    100          convenieceItemList= newArrayList<ConvenienceItemEntity>();
    101          mGeoList.clear();
    102          latLoc.clear();
    103          for(inti=0;i<itemList.size();i++){
    104             ConvenienceItemEntityitemEntity = itemList.get(i);
    105             int lat = Integer.parseInt(itemEntity.getItemLatitude());
    106             int loc = Integer.parseInt(itemEntity.getItemLongtude());
    107             OverlayItemitem = newOverlayItem(newGeoPoint(lat, loc),itemEntity.getConvenienceItemName() ,itemEntity.getConvenienceItemId());
    108              
    109             ViewdrawableView = LayoutInflater.from(BsnsDisAllActivity.this).inflate(
    110                    R.layout.map_drawable_pin, null);// 獲取要轉(zhuǎn)換的View資源
    111             TextViewTestText = (TextView)drawableView.findViewById(R.id.map_drawable_text);
    112             TestText.setText(item.getTitle());//將每個(gè)點(diǎn)的Title在彈窗中以文本形式顯示出來(lái)     
    113              
    114             BitmapdrawableBitmap = convertViewToBitmap(drawableView);
    115              
    116             Drawabledraw = newBitmapDrawable(drawableBitmap);
    117        
    118             item.setMarker(draw);
    119              
    120             convenieceItemList.add(itemEntity);
    121             mGeoList.add(item);
    122             PointlocPoint = newPoint();
    123             locPoint.x = i+1;
    124             locPoint.y = lat;
    125             latLoc.add(locPoint);         
    126          }
    127           
    128          addMarker(mGeoList);
    129          for (int i = 0; i < latLoc.size(); i++){ 
    130                  for (int j = 1; j < latLoc.size() - i; j++) {
    131                    Point p1 = latLoc.get((j-1));
    132                    Point p2 = latLoc.get(j);
    133                      
    134                    if(p1.y>p2.y){
    135                       Point temp = p1;
    136                       latLoc.set(j-1, p2);
    137                       latLoc.set(j, p1);
    138                    }
    139                    if(latLoc.get(j-1).x==0){
    140                       selectedItemLat = j-1;
    141                    }
    142                  }
    143          }
    144       }
    來(lái)自:http://blog.csdn.net/fengshuiyue/article/details/9155463

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多

      主站蜘蛛池模板: 亚洲AV中文无码乱人伦在线观看| 国产精品人妻中文字幕| 深夜在线观看免费av| 久女女热精品视频在线观看| 欧美人与动人物牲交免费观看| 国产一区二区三区美女| 2019国产精品青青草原| 欧美黑人又大又粗XXXXX| 国产在线播放专区av| 好吊妞国产欧美日韩免费观看| 免费又大粗又爽又黄少妇毛片| 中国熟妇毛多多裸交视频| 亚洲精品乱码久久久久久不卡| 午夜免费无码福利视频麻豆| 狠狠色狠狠色综合网| 国产精品午夜精品福利| 国产成人无码免费看视频软件| 国产中文字幕在线一区| 久久久久波多野结衣高潮| 中文字幕日韩人妻一区| 少妇肉麻粗话对白视频| 人人澡人摸人人添| 亚洲精品无码AV人在线观看国产| 久久无码中文字幕免费影院| 人妻人人澡人人添人人爽| 国产高清在线精品一区APP| 99久久精品国产一区二区蜜芽| 国产最新进精品视频| 精品国产中文字幕懂色| 亚洲熟妇少妇任你躁在线观看无码 | 国产美女高潮流白浆视频| 天干天干天啪啪夜爽爽色| 熟妇人妻无码中文字幕老熟妇| 女人喷液抽搐高潮视频| 国产成人高清亚洲综合| 亚洲AV永久纯肉无码精品动漫| 无码人妻丝袜在线视频红杏 | 任我爽精品视频在线播放| 虎白女粉嫩尤物福利视频| 久久久国产乱子伦精品| 99国精品午夜福利视频不卡99 |