mapxtreme2005 坐标解析


最近利用空闲的时间,写了一个坐标解析的类。
作用:在地理信息的实际项目中,会碰到将坐标解析成地名的需求。需要用到GIS平台的空间分析功能。

开发环境:VS2005 + Mapxtreme2005
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using MapInfo.Data;
  5. using MapInfo.Geometry;
  6. using MapInfo.Mapping;
  7. using MapInfo.Engine;
  8. namespace MapXtremeApp
  9. {
  10.     class MapSearch 
  11.     {
  12.         int MinUnitRadius = 10; //单位搜索的起始半径
  13.         int MinRoadRadius = 20;  //道路搜索起始半径
  14.         int MaxRadiusWidth = 200; //最大搜索半径
  15.         int AddRadiusWidth = 20; //搜索半径增幅
  16.         
  17.         /// <summary>
  18.         /// 搜索最近的点目标
  19.         /// </summary>
  20.         /// <param name="map">地图</param>
  21.         /// <param name="x">经度</param>
  22.         /// <param name="y">纬度</param>
  23.         /// <param name="UnitLayers">搜索的图层</param>
  24.         /// <param name="Unit">出参,搜索到的单位名称</param>
  25.         /// <returns>0,精确目标;1, 近似目标;-1,搜索失败</returns>
  26.         public int SearchUnit(Map map, double x, double y, string[] UnitLayers, ref string Unit)
  27.         {
  28.             bool bFirst = true;
  29.             double distemp = 0; double disLowerest = 0;
  30.             double searchradius = 0;
  31.             FeatureGeometry fg = new MapInfo.Geometry.Point(map.GetDisplayCoordSys(), x, y);
  32.             for (searchradius = MinUnitRadius; searchradius < MaxRadiusWidth; searchradius += AddRadiusWidth)
  33.             {
  34.                 Distance dis = new Distance(searchradius, DistanceUnit.Kilometer);
  35.                 SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWithinDistance(fg, dis, ContainsType.Centroid);
  36.                 si.QueryDefinition.Columns = null;
  37.                 for (int i = 0; i < UnitLayers.Length; i++)
  38.                 {
  39.                     string tabalias = UnitLayers[i].ToString();
  40.                     MapInfo.Data.Table tab = MapInfo.Engine.Session.Current.Catalog.GetTable(tabalias);
  41.                     if (tab == null)
  42.                         return -1;
  43.                     IResultSetFeatureCollection irfc = MapInfo.Engine.Session.Current.Catalog.Search(tab, si);
  44.                     if (irfc.Count > 0)
  45.                     {
  46.                         foreach (Feature ftr in irfc)
  47.                         {
  48.                             MapInfo.Geometry.CoordSys CoordSys = map.GetDisplayCoordSys();
  49.                             distemp = CoordSys.Distance(DistanceType.Spherical, DistanceUnit.Kilometer, CoordSys, ftr.Geometry.Centroid, fg.Centroid);
  50.                             if (searchradius <= MinUnitRadius && ftr[1].ToString() != "")//起始半径内搜索
  51.                             {
  52.                                 Unit = ftr[1].ToString();
  53.                                 return 0;
  54.                             }
  55.                             else//扩大搜索范围,选择最近的单位
  56.                             {
  57.                                 if (bFirst || distemp < disLowerest)
  58.                                 {
  59.                                     disLowerest = distemp;
  60.                                     Unit = ftr[1].ToString();
  61.                                     bFirst = false;
  62.                                 }
  63.                             }
  64.                         }
  65.                     }
  66.                 }
  67.             }
  68.             if (Unit == "")
  69.                 return -1;
  70.             return 1;
  71.         }
  72.         public int SearchRoad(Map map, double x, double y, string[] RoadLayers, ref string Road)
  73.         {
  74.             double searchradius = 0;
  75.             int icount = 0;//道路计数器
  76.             FeatureGeometry fg = new MapInfo.Geometry.Point(map.GetDisplayCoordSys(), x, y);
  77.             
  78.             for (searchradius = MinRoadRadius; Road == "" && searchradius < MaxRadiusWidth; searchradius += AddRadiusWidth)
  79.             {
  80.                 FeatureGeometry buffer = fg.Buffer(searchradius, DistanceUnit.Kilometer, 99);
  81.                 SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchIntersectsGeometry(buffer, IntersectType.Geometry);
  82.                 si.QueryDefinition.Columns = null;
  83.                 for (int i = 0; i < RoadLayers.Length; i++)
  84.                 {
  85.                     string tabalias = RoadLayers[i].ToString();
  86.                     MapInfo.Data.Table tab = MapInfo.Engine.Session.Current.Catalog.GetTable(tabalias);
  87.                     if (tab == null)
  88.                         return -1;
  89.                     IResultSetFeatureCollection irfc = MapInfo.Engine.Session.Current.Catalog.Search(tab, si);
  90.                     if (irfc.Count > 0)
  91.                     {
  92.                         if (searchradius <= MinRoadRadius)//起始半径内搜索
  93.                         {
  94.                             foreach (Feature ftr in irfc)
  95.                             {
  96.                                 icount++;
  97.                                 if (icount == 1)//第一个道路
  98.                                     Road = ftr[1].ToString();
  99.                                 else
  100.                                     Road += "、" + ftr[1].ToString();
  101.                             }
  102.                         }
  103.                         else//扩大搜索范围
  104.                         {
  105.                             foreach (Feature ftr in irfc)
  106.                             {
  107.                                 if (ftr[1].ToString() != "")
  108.                                 {
  109.                                     Road = ftr[1].ToString();
  110.                                     return 1;
  111.                                 }
  112.                             }
  113.                         }
  114.                     }
  115.                 }
  116.                 
  117.             }
  118.             if (searchradius <= MinRoadRadius + AddRadiusWidth)//精确搜索有了至少一个结果
  119.             {
  120.                 if (icount > 1)//该位置是多条道路交叉处
  121.                     Road += "交界处";
  122.                 return 0;
  123.             }
  124.             if (Road == "")
  125.                 return -1;
  126.             return 1;
  127.  
  128.         }
  129.         public bool SearchRegion(Map map, double x, double y,string[] RegionLayers, ref string Region)
  130.         {
  131.             FeatureGeometry fg = new MapInfo.Geometry.Point(map.GetDisplayCoordSys(), x, y);
  132.             SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchIntersectsGeometry(fg, IntersectType.Geometry);
  133.             si.QueryDefinition.Columns = null;
  134.             for (int i = 0; i < RegionLayers.Length; i++)
  135.             {
  136.                 string tabalias = RegionLayers[i].ToString();
  137.                 MapInfo.Data.Table tab = MapInfo.Engine.Session.Current.Catalog.GetTable(tabalias);
  138.                 if (tab == null)
  139.                     return false;
  140.                 IResultSetFeatureCollection irfc = MapInfo.Engine.Session.Current.Catalog.Search(tab, si);
  141.                 if (irfc.Count > 0)
  142.                 {
  143.                     for (int j = 0; j < irfc.Count; j++)
  144.                     {
  145.                         Region = irfc[j][1].ToString();
  146.                     }
  147.                     return true;
  148.                 }
  149.             }
  150.             return false;
  151.         }
  152.         public bool PosAnalysis(Map map, double x, double y, string[] UnitLayers, string[] RoadLayers, string[] RegionLayers, ref string PosReport)
  153.         {
  154.             string strUnit = "";
  155.             string strRoad = "";
  156.             string strRegion = "";
  157.             if (SearchUnit(map, x, y, UnitLayers, ref strUnit) == 1)
  158.                 strUnit += "附近";
  159.             if (SearchRoad(map, x, y, RoadLayers, ref strRoad) == 1)
  160.                 strRoad += "附近的";
  161.             SearchRegion(map, x, y, RegionLayers, ref strRegion);
  162.             if (strRegion != "")
  163.             {
  164.                 PosReport = strRegion + strRoad + strUnit;
  165.                 return true;
  166.             }
  167.             return false;
  168.         }
  169.     }
  170. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值