超级简洁好用的GIS系统! 一个函数搞定!(附源码下载)

By | 2020年4月4日

偶尔一些小项目会需要简单的GIS功能,中间尝试过采用第三方GIS控件或自己研发控件的方法,都不太理想。
第三方控件的功能比较强大,但支持DELPHI的GIS控件很少,基本都不便宜。
自已试图研发一款控件,但拖动/缩放等功能实现起来总的来说比较麻烦。

本例采用Delphi自带的TChart控件,直接读取geojson格式数据,可以快速实现GIS功能

主要是利于TChart的绘图能力,以及对缩放/拖动等的支持!

procedure LoadGeoJson(AChart:TChart;AFile:String);
var
     iFeature  : Integer;
     iCoord    : Integer;
     iPoint    : Integer;
     iItem     : Integer;
     //
     fX,fY     : Double;
     //
     joGeo     : TJsonObject;
     joFeature : TJsonObject;
     jaCoords  : TJsonArray;
     jaCoord   : TJsonArray;
     jaPoint   : TJsonArray;
     jaItem    : TJsonArray;
     //
     oSeries   : TFastLineSeries;
     oTitle    : TChartShape;
     iColor    : TColor;
begin
     try
          iColor    := -1;
          //
          if not FileExists(AFile) then begin
               Exit;
          end;

          //
          joGeo     := TJsonObject.Create;
          joGeo.LoadFromFile(AFile,False);

          //逐项绘制
          for iFeature := 0 to joGeo.A['features'].Count-1 do begin
               joFeature := joGeo.A['features'][iFeature];
               //
               jaCoords  := joFeature.O['geometry'].A['coordinates'];
               //
               for iCoord := 0 to jaCoords.Count-1 do begin
                    jaCoord   := jaCoords.A[iCoord];
                    //
                    oSeries   := TFastLineSeries.Create(AChart);
                    oSeries.ParentChart      := AChart;
                    oSeries.XValues.Order    := loNone;

                    //
                    for iPoint := 0 to jaCoord.Count-1 do begin
                         jaPoint   := jaCoord.A[iPoint];

                         //
                         if jaPoint.Types[0] = jdtArray then begin
                              for iItem := 0 to jaPoint.Count-1 do begin
                                   jaItem   := jaPoint.A[iItem];

                                   oSeries.AddXY(jaItem.F[0],jaItem.F[1]);
                              end;

                         end else begin
                              oSeries.AddXY(jaPoint.F[0],jaPoint.F[1]);
                         end;

                    end;

               end;

               //得到中心点位置
               fX   := (oSeries.MaxXValue + oSeries.MinXValue)/2;
               fY   := (oSeries.MaxYValue + oSeries.MinYValue)/2;

               //显示名称
               oTitle    := TChartShape.Create(AChart);
               oTitle.ParentChart  := AChart;
               oTitle.Font.Name         := '微软雅黑';
               oTitle.X0 := fX;
               oTitle.X1 := fX;
               oTitle.Y0 := fY;
               oTitle.Y1 := fY;
               if joFeature.O['properties'].Contains('name') then begin
                    if  joFeature.O['properties'].Types['name'] = TJsonDataType.jdtString then begin
                         oTitle.Text.Text    := '  '+joFeature.O['properties'].S['name'];
                    end;
               end;
          end;
     except
          ShowMessageFmt('Error when LoadGeojson! Name = %s,  iFeature = %d',[AFile, iFeature]);
     end;

end;

发表评论

电子邮件地址不会被公开。 必填项已用*标注