兄台:不知以下代码部可否实现根据居民点的坐标显示这些点
procedure TForm1.Button1Click(Sender: TObject);
var
   ds:cmapxdataset;
   dbk:variant;
   BindLayerObject:cMapXBindLayer;
   flds:cmapxFields;begin
    map1.datasets.removeall;
    dbk := CreateOleObject('MapX.ODBCQueryInfo.3');
    dbk.SqlQuery := 'select *from Us_Cust';
    dbk.DataSource := 'ddbb5';
    dbk.ConnectString := 'ODBC;';    flds:=cofields.create;
    flds.Add('City', 'City', miAggregationIndividual, miTypeString);
    flds.Add('State', 'State', miAggregationIndividual, miTypeString);
    flds.Add('Longitude', 'Longitude', miAggregationSum, miTypeNumeric);
    flds.Add('Latitude', 'Latitude', miAggregationSum, miTypeNumeric);    BindLayerObject:=cobindlayer.create;
    BindLayerObject.LayerName := 'citypot';
    BindLayerObject.RefColumn1 := 3 ; 
    BindLayerObject.RefColumn2 := 4 ;
    BindLayerObject.LayerType := miBindLayerTypeXY;
 
   ds := Map1.Datasets.Add(miDataSetODBC, dbk, 'U.S. Cities','City', 'State',BindLayerObject, flds,false);
   ......end;   以上代码运行有错误,这种方法是否行不通?请指教,谢谢!

解决方案 »

  1.   

    我想这个问题是一个数据库问题:建表含ID,X,Y其中ID是与细表联系的字段,X,Y是鼠标落下的坐标.,不过我认为X,Y应该是一个圆心坐标,在圆范围里显示数据.,也即居民的坐标在圆范围内,应该是这样吧!
      

  2.   

    是不是可以根据坐标在图层上画点,而选中该点后根据点的唯一性属性再去数据库中查找出其他信息并已一定形式显示?
    不只可不可以,我以前做Autodesk的MapGuide时是可以的,对于MapX还不太懂
      

  3.   

    具体实现我想要用到数学知识:
    (X-canvas.x)*(X-canvas.x)+(Y_canvas.y)*)+(Y_canvas.y)<=r*r
    X,Y是居民的坐标!
    希望对你有些帮助!
      

  4.   

    try
                FID := FieldByName('地图结点号').AsInteger;
                LrName := FieldByName('地图层名称').AsString;
                lr := Map1.Layers.Item(lrName);
                if lr <> nil then
                  begin
                   try
                    f := lr.GetFeatureByID(FID);
                   except
                   end;
                    if f <> nil then
                      lr.AddFeature(f);
                  end;
               finally
                Next;
               end;
      

  5.   

    其实要显示地图上的Feature信息,只要设置一下MapX组件的一个属性即可,如果要显示坐标,到是有点麻烦,要根现有的坐标系,然后转化成要显示的坐标系,有段时间没做GIS了,忘得差不多了,如果需要给你个例子!
    ===================================================================
     暗恋女司机,薪水全做公交车了! 
    http://www.csdn.net/expert/topic/926/926315.xml?temp=4.807681E-02
      

  6.   

    楼上兄台,可否将例子给我,帮小弟一把?[email protected],我的邮箱。谢谢!!QQ:35047038。
      

  7.   

    procedure TMapBaseForm.MapTopoMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      FCurXCoord: Double;               // Current X coordination on map
      FCurYCoord: Double;               // Current Y coordination on map
      ScreenX, ScreenY: Single;
      FeatureKey: String;
    begin
      ScreenX := X;
      ScreenY := Y;
      { Save current mouse position for add new rolly point. }
      MapTopo.ConvertCoord(ScreenX, ScreenY, FCurXCoord, FCurYCoord, miScreenToMap);  FeatureKey := GetFeatureKey(FCurXCoord, FCurYCoord);
      if FeatureKey <> EmptyStr then
        根据FeatureKey就可以做你要做的事情了,MapX的Demo中有;
    end;function TMapBaseForm.GetFeatureKey(AMapX, AMapY: Double): String;
    var
      Point: CMapXPoint;
      Features: Variant;
      InfoFeature: Variant;
    begin
      Result := EmptyStr;  Point := CoPoint.Create;
      Point.Set_(AMapX, AMapY);  Features := FFeatureLayer.SearchAtPoint(Point);
      if Features.Count > 0 then
      begin
        InfoFeature := Features.Item(1);
        Result := InfoFeature.FeatureKey;
      end; {if}
    end;
      

  8.   

    第一、 捆绑地图数据
    数据捆绑是将不同来源的数据对应到地图层的过程,捆绑结果会产生一个Dataset对象,Dataset对象的集合组成Datasets Collection,它定义了Map对象的数据集属性。 你可以通过Datasets将不同来源的数据捆绑到地图上实现图文互动,或创建专题图,如下例ODBC Access数据的捆绑及专题分析: 
       procedure TMapForm.ODBC1Click(Sender: TObject); 
       var 
      param: ODBCQueryInfo ;  
    ds: Dataset; //定义数据集 
    Datafields: Fields; //定义数据域 
    begin 
    param.SqlQuery := 'select * from China'; //选择Access数据库中的China表  
    param.DataSource := 'MapChina'; //ODBC 数据源名 
    param.ConnectString := 'ODBC;'; //或是user = ... Pwd = ... , 定义ODBC连接 
    Datafields.Add('GEONAME','GEONAME', miAggregationAuto,miTypeString); //添加数据域GEONAME 
    Datafields.Add('POPU','POPU', miAggregationAuto,miTypeNumeric); //添加数据域POPU 
    //将Access数据捆绑到Mapinfo China表 
    ds := Map.Datasets.Add(miDataSetODBC, param, unassigned, unassigned, unassigned, 'CHINA', Datafields, unassigned);  
    ds.Themes.Add(miThemeRanged, 'POPU', 'MyTheme'); //添加一个范围专题图  
    end; 第二、建立客户定制工具
    你还可以定制自己的地图操作工具,下面通过定制一个名为Info的信息按钮工具简述方法步骤: 
    (1)定义客户工具常量  
        Const CUSTOM_INFO_TOOL = 1 
    (2)利用Map对象的CreateCustomTool方法定义客户工具,方法为: 
       CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor] , [CtrlCursor], [InfoTips]) 
    其中ToolNumber为工具号,即上面定义的常量;Type为工具类型;Cursor为光标形状,其他参数可选。  
    //定义Info工具为十字光标点触发工具 
     Map.CreateCustomTool(CUSTOM_INFO_TOOL, miToolTypePoint, miCrossCursor, miArrowCursor, miArrowCursor, unassigned) 
    (3)在Map对象事件ToolUsed中编写工具的Handler(操作内容)  
     procedure TMain.MapToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1, X2, Y2, Distance: Double; 
                    Shift, Ctrl: WordBool; var EnableDefault: WordBool); 
     begin 
     Case ToolNumber of 
    CUSTOM_INFO_TOOL : //信息工具Info 
    try  
    …… 
    end; 
    (4)定义信息按钮的Click事件 
    procedure TMain.InfoClick(Sender: TObject); 
    begin 
    Map.CurrentTool:=CUSTOM_INFO_TOOL; 
    end  第三、使用专题图
    1、 专题地图的概念
      MapInfo的一个显著特征就是能将数据库中的信息进行直观的可视化分析。专题地图就是用于分析和表现数据的一种强有力的方式。用户可以通过使用专题地图的方式将数据图形化,使数据以更直观的形式在地图上体现出来。当使用专题渲染在地图上显示数据时,可以清楚地看出在数据记录中难以发现的模式和趋势,为用户的决策支持提供依据。专题地图是MapInfo中的一个重要概念,是用户使用好MapInfo的一种体现。
      制作专题地图是根据某个特定专题对地图进行“渲染”的过程。所谓的专题渲染,就是以某种图案或颜色填充来表明地图对象(点、线、区域)的某些信息(例如人口、大小、年降雨量、日期等等),也就是说,这类渲染存在着主题,经过这样渲染的地图就是专题地图。利用MapInfo,可根据数据库表中特定的值来赋给地图对象颜色、图案或符号,从而创建不同的专题地图。
      2、 专题图的六种类型
      MapInfo为创建专题地图提供了强有力的支持。用户可以使用范围值、等级符号、点密度、独立值、直方图和饼图等多达六种方式来创建不同的专题地图。
      (1)、 范围值
      按照设置的范围显示数据。这些范围用颜色和图案进行渲染。范围专题地图能够通过点、线和区域来说明数值,在反映数值和地理区域的关系(如销售数字,家庭收入),或显示比率信息如人口密度(人口除以面积)时是很有用的。
      (2)、 等级符号
      等级符号为表中每条记录显示一个符号,符号大小与数据值成比例。等级符号地图用特定的数值来显示数据点,对于阐明定量信息(如由高到低依次变化)很有用处。符号的大小与该点对应的数值成比例,数值越大点就越大,数值越小点就越小。因此,等级符号最适合数据值数据。
      (3)、 点密度
      在地图上用点来显示数据,每一点都代表一定数量,某区域中点的总数与该区域数值成比例。每个点代表一定数量的单元,该数乘以区域内总的点数,就等于该区域的数据值。
      (4)、 独立值
      按独立数值渲染地图,可以表达多个变量。根据独立值绘制地图对象的专题地图有助于强调数据的类型差异而不是显示定量信息(如给定区域内的商店类型、分区类型等等)。
      (5)、 直方图
      将表中每条记录的专题变量显示为一个直方图。使用直方图可分析地图中每条记录的多个变量。比较每个直方图中各直方条的大小可考察表中某条记录,比较所有直方图中某一条的大小可考察所有记录的某个变量,而比较各直方图的高度可考察整张表。用直方图来表达负值时,该条会沿直方图反方向伸展。在叠加直方图中不显示负值。
      (6)、 饼图
      以饼图显示表中各记录的专题变量。饼图可包含多个变量。在地图上使用饼图可一次分析多个变量,比较每个图中饼扇的大小可考察表中某条记录,比较所有饼图中某一个饼扇,可考察所有记录中某个变量的变化,比较各饼图的直径可考察整张表。
      3、 MapX对专题图的支持
      MapX中使用Themes集合与Theme对象来实现对专题图的支持,每个Themes集合中可以包含多个Theme对象,也就是说,针对一个Dataset,可以创建多幅不同的专题地图。
      每个Dataset都拥有一个Themes集合,并以其属性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制专题的添加和删除。
      &Oslash; Add方法:创建一个专题并将其加入到某个特定的DataSet的Themes集合中,
        Map1.Datasets(1).Themes.Add(miThemeRanges,’’’area’,’Myranges Theme’)
      &Oslash; Remove方法:从集合中删除某一特定的专题图
        Map1.Datasets(1).Themes.Remove "My Ranges Theme"
      &Oslash; RemoveAll方法:从集合中删除所有的的专题图
        Map1.Datasets(1).Themes.RemoveAll 
      Theme对象用于设置每个专题图的属性。
      比较重要的有
      &Oslash; Layer:返回一个Layer对象,表示该专题图所在的图层
      &Oslash; Legend:控制 对专题地图的说明,即图例
      &Oslash; ComputeTheme 控制是否可以对原始数据进行计算,默认为True
      &Oslash; Type 即专题图类型,取值范围为ThemeTypeConstants
      &Oslash; Fields 只读属性,返回该专题图所基于的Dataset中的字段集合
      ThemeProperties 复合型属性,对应ThemeProperties对象,包含了专题图详尽的定义信息,如范围定义、显示风格设置等。
      4、 专题图的规划
      在创建专题图的过程中,有几个关键因素,包括专题图变量的确定、属性数据的获取以及专题图层的显示与控制。
      (1)、 确定专题图变量
      在专题图中显示的数据就是专题图变量。例如在行政区面积专题图中,表示面积的字段“area”就是这个专题地图的专题地图变量。
      一个专题变量可以是一个字段或表达式。取决于专题图的类型,在一张地图上可以显示一个或多个专题图变量。范围值、等级符号、点密度和独立值地图都只检查一个变量。可以利用饼图或直方图一次显示多个专题变量。也可以创建双变量专题地图,其中一个地图对象可代表两个不同的数据,入符号的颜色代表一个专题变量,符号的大小代表另一个专题变量。
      (2)、 属性数据的获取
      在创建专题地图之前,必须确定需要显示何种信息,信息存储在什么位置。它可以在创建地图时所基于的表中,也可以在ODBC支持的外部数据库中。数据来源于Field对象或Field集合,在Themes.Add方法中通过Fields参数传递。
      (3)、 创建专题图
      首先应将某个产生专题图数据的dataset引入地图中,之后使用Themes.Add方法创建一个Theme对象。
      curmap.Datasets(1).Themes.Add(miThemeRanges,‘TotPop’,‘’);
      语法: Themes.Add [Type], [Field], [Name] 
      Type用于定义要创建的专题图的类型,它的取值范围是ThemeTypeConstants,该参数可选,如果没有定义或者定义为miThemeAuto,MapX会根据字段数以及已经存在的专题图类型自动在ThemeTypeConstants中选择一个。如果MapX无法自行确定专题类型,就会产生一个错误。
    Field(s)定义在专题图中使用的一个或多个字段,可以通过字段名、字段索引或字段对象来引用。当创建多变量专题图时,可以使用数组表示。该字段是可选的,若不特意指定,MapX会使用DataSet中的第一个数字型字段。
      Name,即专题图的名称,String类型参数,若不指定,MapX会自动生成一个名字。
      (4)、 专题图类型常量
      专题图变量由Theme.Typeproperty取得,其定义如下:
         miThemeRanged = 0 
         miThemeBarChart = 1 
         miThemePieChart = 2 
         miTheme GradSymbol = 3 
         miThemeDotDensity = 4 
         miThemeIndividualValue = 5 
         miThemeAuto = 6 
         miThemeNone = 9
      5、 控制专题地图
      有两种方法可以控制专题地图。
      (1)、 使用Theme.ThemeDlg方法
      该方法显示一个对话框,用户可以直接修改专题图特性。语句如下:
        curmap.Datasets(1).Themes(1).ThemeDlg;
      这种方法虽然简单,但是而且很难与自己的程序风格相一致,用户界面不友好,而且在这个默认的对话框中,用户可以随意改变任何设置,使得程序的控制难度加大。 
      (2)、 改变ThemeProperties对象属性
      通过设置ThemeProperties
      

  9.   

    也许这回对你有一点帮助:
    http://www.mapinfo.com.cn/bbs/Topic.asp?topic_id=4074&forum_id=4&Topic_Title=MapX%25BC%25BC%25CA%25F5%25B7%25D6%25CE%25F6%25A3%25AD%25C8%25EB%25C3%25C5%25C6%25&forum_title=MapInfo+MapX
      

  10.   

    我是这样做的:procedure TMDIChild.Map1ToolUsed(Sender: TObject; ToolNum: Smallint; X1,
      Y1, X2, Y2, Distance: Double; Shift, Ctrl: WordBool;
      var EnableDefault: WordBool);
    var
      pt:CMapXPoint;
      lyr,lyrA:CMapXLayer;
      fts:CMapXFeatures;
      ft:CMapXFeature;
      ds: CMapXDataset;  MapName: string;
      CircMi: Double;
      AreaName: string;
      FtrName: string;  LayerName: string;
      FileName: string;  LayerInfo: CMapXLayerInfo;
      FILEOBJ: TFileStream;  r: variant; //设置字体大小
      LyrName, LyrAName: string;begin  case ToolNum of
      CUSTOM_INFO_TOOL : //信息工具Info
      begin
        pt := CoPoint.Create;
        pt.Set_(X1,Y1);
        lyr:=GetLayer(pt,mArea);
        mlyr:= lyr;
        AddtoSelection(lyr,pt,X1,Y1,Ctrl);
    //    pt._Release;
      end;
    end;procedure TMDIChild.AddToSelection(lyr:CMapXLayer; pt:CMapXPoint;X1,Y1:Double;Ctrl:WordBool);
    var
      ft:CMapXFeature;
      fts:CMapXFeatures;
    begin
      fts:= lyr.SearchAtPoint(pt);
      if fts.Count = 0 then
      begin  
      end
      else
      begin
        ft := fts.Item(1);
        if not Ctrl then
          lyr.Selection.Replace(ft)
        else
          lyr.Selection.Add(ft);
        displayobjinfo(lyr);
      end;{if}
    end;procedure displayobjinfo(lyr: CMapXLayer);
    begin
      with Child do
      begin
        if not frmInformation.Showing then
           frmInformation.Show
        else
        begin
          with frmInformation do
          begin
            UpdateTreeView(lyr);
          end;
        end;
      end;
    end;procedure TfrmInformation.UpdateTreeView(lyr: CMapXLayer);
    var
      i,j,L,M: integer;
      ftr: CMapXFeature;
      ds: CMapXDataset;
      fld: CMapXField;
      lyrNode, ftrNode: TTreeNode;
      RootNode: TTreeNode;
      multitag: Boolean;
      singleX,singleY: Double;
      value: Variant;
      strValue, NDName: string;
    begin
      frmInfoShowed := True;
      if tvwInformation.HasParent then
        multitag:=true
      else
        multitag:=false;    tvwInformation.Items.Clear;
        tvwInformation.Items.BeginUpdate;    with Child do
        begin
    //      RootNode:= tvwInformation.Items.Add( nil,lyr.Name );
        //    for i:=0 to Map1.Layers.count-1 do
        //    begin
          if lyr.Selection.Count>0 then
             lyr.BeginAccess(miAccessRead);      lyrNode := tvwInformation.Items.AddChild(nil , lyr.Name);
          lyrNode.Expanded := True;
          for j:=0 to lyr.Selection.Count-1 do
          begin        ftr := lyr.Selection.Item(j+1);
            ftrNode := tvwInformation.Items.AddChild(lyrNode, ftr.Name);
            //lyr.Name+inttostr(ftr.FeatureID)+ftr.Name);        if multitag then
            begin
              ftrNode.Expanded := True;
              multitag := not multitag;
            end;
            for L:= 0 to lyr.Datasets.Count-1 do
            begin
              ds:= lyr.Datasets.Item(L+1);
              for M:=0 to ds.Fields.Count-1 do
              begin
        //          if fld =ds.Fields.Item(M+1) then
        //          begin
                  fld :=ds.Fields.Item(M+1);
                  if (ds.Value[ftr, fld.Name] <> Null) and (Trim(fld.Name) <> 'NAME') then
                  begin
                    value := ds.Value[ftr, fld] ;
                    if(TVarData(value).vType = varOleStr) then
                      strValue := value
                    else
                      strValue:=ds.Value[ftr, fld];                if fld.Name ='MobileNodes' then
                       NDName:='移动营业厅数量'
                    else
                       NDName:='联通营业厅数量';                tvwInformation.Items.AddChild(ftrNode,NDName +': ' +strValue);
                  end;
              end;
            end;
          end;
          lyr.EndAccess(miAccessEnd);
    //      end;{For Layer1}
          tvwInformation.Items.EndUpdate;
          tvwInformation.FullExpand;      if multitag then
          begin
            lyrNode.Expanded := True;
            ftrNode.Expanded := True;
            multitag := not multitag;
          end;
      end;
    end;献丑了!
      

  11.   

    感谢楼上的quantum和icesnow0大哥!其实我早就想请教你们问题了,因为见过你们回复的帖子,感觉你们在这方面确实懂得很多!谢谢你们,我会参考!my QQ:35047038。虽然我是学通信的,但是我对这方面很有兴趣,而且最近的课题就是grs方面的。希望得到你们的帮助!谢谢!