Files
fl-knowledge/LP/MapData.cs
T

280 lines
5.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using AxMapWinGIS;
using MapWinGIS;
namespace LP;
public class MapData
{
public List<double> mListX = null;
public List<double> mListY = null;
public double mMinX = 0.0;
public double mMaxX = 0.0;
public double mMinY = 0.0;
public double mMaxY = 0.0;
public double mBS = 1.0;
public MapData()
{
Init_ListX_ListY();
Clear_ListX_ListY();
}
private void Init_ListX_ListY()
{
if (mListX == null)
{
mListX = new List<double>();
}
if (mListY == null)
{
mListY = new List<double>();
}
}
private void Clear_ListX_ListY()
{
Init_ListX_ListY();
mListX.Clear();
mListY.Clear();
}
public void SetXY_OneLine(List<double> _listX, List<double> _listY)
{
Clear_ListX_ListY();
int count = _listX.Count;
int count2 = _listY.Count;
int num = ((count < count2) ? count : count2);
for (int i = 0; i < num; i++)
{
mListX.Add(_listX[i]);
mListY.Add(_listY[i]);
}
}
public void SetXY_OneLine(double[] _arrX, double[] _arrY)
{
Clear_ListX_ListY();
int num = _arrX.Length;
int num2 = _arrY.Length;
int num3 = ((num < num2) ? num : num2);
for (int i = 0; i < num3; i++)
{
mListX.Add(_arrX[i]);
mListY.Add(_arrY[i]);
}
}
private void SenJi()
{
mBS = 1.0;
if (mListX.Count == 0)
{
mMaxX = (mMinX = (mMaxY = (mMinY = 0.0)));
return;
}
if (mListX.Count == 1)
{
mMaxX = (mMinX = mListX[0]);
mMaxY = (mMinY = mListY[0]);
return;
}
mMaxX = mListX.Max();
mMinX = mListX.Min();
mMaxY = mListY.Max();
mMinY = mListY.Min();
double num = Math.Abs(mMaxX - mMinX);
double num2 = Math.Abs(mMaxY - mMinY);
double num3 = num;
if (num3 < num2)
{
num3 = num2;
}
if (!(num3 < 1E-20))
{
mBS = 1000.0 / num3;
}
}
public Shapefile CreateShapefile()
{
SenJi();
Shapefile shapefile = new ShapefileClass();
shapefile.CreateNew("", ShpfileType.SHP_POLYLINE);
Shape shape = new ShapeClass();
shape.Create(ShpfileType.SHP_POLYLINE);
Point point = null;
int num = 0;
for (int i = 0; i < mListX.Count; i++)
{
point = new PointClass();
point.x = (mListX[i] - mMinX) * mBS;
point.y = (mListY[i] - mMinY) * mBS;
num = shape.numPoints;
shape.InsertPoint(point, ref num);
}
num = shapefile.NumShapes;
shapefile.EditInsertShape(shape, ref num);
return shapefile;
}
public Shapefile CreatePoints_forLine()
{
SenJi();
Shapefile shapefile = new ShapefileClass();
shapefile.CreateNew("", ShpfileType.SHP_POINTM);
Shape shape = new ShapeClass();
shape.Create(ShpfileType.SHP_POINTM);
Point point = null;
int num = 0;
for (int i = 0; i < mListX.Count; i++)
{
point = new PointClass();
point.x = (mListX[i] - mMinX) * mBS;
point.y = (mListY[i] - mMinY) * mBS;
num = shape.numPoints;
shape.InsertPoint(point, ref num);
}
num = shapefile.NumShapes;
shapefile.EditInsertShape(shape, ref num);
return shapefile;
}
private void AddRing(bool clockWise, double x, double y, double radius, ref Shape shp)
{
int PartIndex = shp.NumParts;
if (shp.numPoints > 0)
{
shp.InsertPart(shp.numPoints, ref PartIndex);
}
int num = 0;
double num2 = 0.0;
double num3 = 0.0;
for (int i = 0; i < 37; i++)
{
num2 = radius * Math.Cos((double)i * Math.PI / 18.0);
num3 = radius * Math.Sin((double)i * Math.PI / 18.0);
num3 *= (double)((!clockWise) ? 1 : (-1));
Point point = new PointClass();
point.x = x + num2;
point.y = y + num3;
num = shp.numPoints;
shp.InsertPoint(point, ref num);
}
}
public Shapefile CreatePoints_forLine_Ring(int _currentZoom)
{
SenJi();
Shapefile shapefile = new ShapefileClass();
shapefile.CreateNewWithShapeID("", ShpfileType.SHP_POLYGON);
double num = 0.0;
double num2 = 0.0;
double num3 = 6.0;
switch (_currentZoom)
{
case 20:
num3 = 2.0;
break;
case 19:
num3 = 4.0;
break;
case 18:
num3 = 5.0;
break;
case 17:
num3 = 6.0;
break;
case 16:
num3 = 8.0;
break;
case 15:
num3 = 9.0;
break;
case 14:
num3 = 10.0;
break;
case 13:
num3 = 12.0;
break;
case 12:
num3 = 14.0;
break;
case 11:
num3 = 16.0;
break;
case 10:
num3 = 18.0;
break;
case 9:
num3 = 20.0;
break;
case 8:
num3 = 25.0;
break;
case 7:
num3 = 30.0;
break;
case 6:
num3 = 40.0;
break;
case 5:
num3 = 50.0;
break;
case 4:
num3 = 60.0;
break;
case 3:
num3 = 70.0;
break;
case 2:
num3 = 80.0;
break;
case 1:
num3 = 90.0;
break;
}
num3 = (int)(num3 * 1.3);
int num4 = 0;
for (int i = 0; i < mListX.Count; i++)
{
Shape shp = new ShapeClass();
shp.Create(ShpfileType.SHP_POLYGON);
num = (mListX[i] - mMinX) * mBS;
num2 = (mListY[i] - mMinY) * mBS;
AddRing(clockWise: true, num, num2, num3, ref shp);
num4 = shapefile.NumShapes;
shapefile.EditInsertShape(shp, ref num4);
}
return shapefile;
}
public void DrawLine(ref AxMap axMap)
{
int num = 0;
Shapefile shapefile = CreateShapefile();
num = axMap.AddLayer(shapefile, visible: true);
Utils utils = new UtilsClass();
axMap.ZoomToLayer(num);
LinePattern linePattern = null;
linePattern = new LinePatternClass();
linePattern.AddLine(utils.ColorByName(tkMapColor.Gray), 6f, tkDashStyle.dsSolid);
linePattern.AddLine(utils.ColorByName(tkMapColor.LightGray), 4f, tkDashStyle.dsSolid);
ShapefileCategory shapefileCategory = shapefile.Categories.Add("River");
shapefileCategory.DrawingOptions.LinePattern = linePattern;
shapefileCategory.DrawingOptions.UseLinePattern = true;
((IShapefile)shapefile).set_ShapeCategory(0, 0);
shapefile = CreatePoints_forLine_Ring(axMap.CurrentZoom);
num = axMap.AddLayer(shapefile, visible: true);
axMap.ZoomToLayer(num);
}
}