首页测试

cad dxf 文件解析

1.参考

gdal doc
gdal api

Java调用开源GDAL解析dxf成shp,再调用开源GeoTools解析shp文件

GDAL/OGR创建DXF文件中多图层的方法

Java FieldDefn类代码示例

颜色

1.Feature

gdal中样式工具箱
image

  • 创建

Feature feature = new Feature(featureDefn);
//添加工具箱 画笔样式
feature.SetStyleString("PEN(c:#3333FF,w:55px)");

/*
通过定义 featureCollection json自动格式化为SimpleFeature

{
  "type":"FeatureCollection",
  "features":[
    {
      "type":"Feature",
      "id":"bmwgwy_well.26212",
      "geometry":{
        "type":"Point",
        "coordinates":[106.0815102,30.7653518]
      },
      "geometry_name":"SHAPE",
      "properties":{
        "code":"WS209027",
        "longitude":"106.081510204876",
        "latitude":"30.7653518034129",
        "street":"511302004000"
      }
    },
    {
      "type":"Feature",
      "id":"bmwgwy_well.26213",
      "geometry":{
        "type":"Point",
        "coordinates":[106.08157489,30.76534738]
      },
      "geometry_name":"SHAPE",
      "properties":{
        "code":"WS209028",
        "longitude":"106.08157488724",
        "latitude":"30.7653473830557",
        "street":"511302004000"
      }
    }
  ],
  "totalFeatures":2,
  "numberMatched":2,
  "numberReturned":2,
  "timeStamp":"2022-08-10T02:33:00.109Z",
  "crs":{
    "type":"name",
    "properties":{
      "name":"urn:ogc:def:crs:EPSG::4326"
    }
  }
}
*/
InputStream is = new ByteArrayInputStream(JSON.toJSONString(stringObjectMap.get("json")).getBytes());
FeatureJSON fjson = new FeatureJSON(new GeometryJSON(15));
FeatureCollection featureCollection = fjson.readFeatureCollection(is);

image

  • 获取定义字段的值
String subClass = feature.GetFieldAsString("SubClasses");

1.1 FeatureDefn

创建feature必须的 定义,里面主要包括 FieldDefn

FeatureDefn featureDefn = new FeatureDefn();

FieldDefn fieldDefnCode = new FieldDefn(Contants.CODE, ogr.OFTString);
fieldDefnCode.SetWidth(50);

featureDefn.AddFieldDefn(fieldDefnCode);

2.FieldDefn(字段定义)

不管是 layer 还是 feature 都可以添加FieldDefn

//可选
lineLayer.CreateField(FieldDefn);

feature.见 1.Feature
  • 类型 org.gdal.ogr.ogrConstants
    image

字段定义:key:type

new FieldDefn(Contants.START_CODE, ogr.OFTString);
点击查看代码

3.Geometry

图形类型:类似于mysql中的地理数据类型

//获取中心点 gemo
geometry.Centroid()

//定义不同的Geometry类型
![image](https://img2022.cnblogs.com/blog/1165505/202208/1165505-20220810145931906-2146524056.png)

Geometry geometry = new Geometry(ogr.wkbLineString);
geometry.AddPoint(0.0,0.0);
geometry.AddPoint(1.0,0.0);
geometry.AddPoint(1.0,1.0);
geometry.AddPoint(0.0,1.0);
geometry.AddPoint(0.0,0.0);
geometry.CloseRings();
feature.SetGeometry(geometry);


Feature lineF = new Feature(featureDefn);
lineF.SetField("layer","lineF");
lineF.SetStyleString("PEN(c:#3333FF,w:85px)");
Geometry lineG = Geometry.CreateFromWkt("LINESTRING(0.0 0.0,10.0 10.0)");
lineF.SetGeometry(lineG);
layer.CreateFeature(lineF);
  • 根据已画好的图形定义坐标,并对图形中的点 设定偏移量,如果要生成新的图形。只需要还原模板中的图形点坐标,并加上新点的坐标即可
/*
{               "type":"MultiLineString",
                "coordinates":[
                    [
                        [
                            66491.9466832115,
                            65294.22789670731
                        ],
                        [
                            66491.9390718653,
                            65294.314894792486
                        ],
                        [
                            66491.9164690936,
                            65294.399249484864
                        ],
                        [
                            66491.87956167018,
                            65294.478397709805
                        ],
                        [
                            66491.82947100842,
                            65294.54993458855
                        ],
                        [
                            66491.76771908774,
                            65294.611686509226
                        ],
                        [
                            66491.69618220901,
                            65294.66177717098
                        ],
                        [
                            66491.61703398406,
                            65294.6986845944
                        ],
                        [
                            66491.53267929167,
                            65294.721287366105
                        ],
                        [
                            66491.4456812065,
                            65294.7288987123
                        ],
                        [
                            66491.35868312133,
                            65294.721287366105
                        ],
                        [
                            66491.27432842895,
                            65294.6986845944
                        ],
                        [
                            66491.19518020401,
                            65294.66177717098
                        ],
                        [
                            66491.12364332526,
                            65294.611686509226
                        ],
                        [
                            66491.06189140459,
                            65294.54993458855
                        ],
                        [
                            66491.01180074282,
                            65294.478397709805
                        ],
                        [
                            66490.9748933194,
                            65294.399249484864
                        ],
                        [
                            66490.9522905477,
                            65294.314894792486
                        ],
                        [
                            66490.94467920151,
                            65294.22789670731
                        ],
                        [
                            66490.9522905477,
                            65294.14089862213
                        ],
                        [
                            66490.9748933194,
                            65294.05654392975
                        ],
                        [
                            66491.01180074282,
                            65293.97739570481
                        ],
                        [
                            66491.06189140459,
                            65293.90585882607
                        ],
                        [
                            66491.12364332526,
                            65293.84410690539
                        ],
                        [
                            66491.195180204,
                            65293.794016243635
                        ],
                        [
                            66491.27432842895,
                            65293.75710882022
                        ],
                        [
                            66491.35868312133,
                            65293.73450604851
                        ],
                        [
                            66491.4456812065,
                            65293.72689470231
                        ],
                        [
                            66491.53267929167,
                            65293.73450604851
                        ],
                        [
                            66491.61703398406,
                            65293.75710882022
                        ],
                        [
                            66491.69618220901,
                            65293.794016243635
                        ],
                        [
                            66491.76771908774,
                            65293.84410690539
                        ],
                        [
                            66491.82947100842,
                            65293.90585882607
                        ],
                        [
                            66491.87956167018,
                            65293.97739570481
                        ],
                        [
                            66491.9164690936,
                            65294.05654392975
                        ],
                        [
                            66491.9390718653,
                            65294.14089862213
                        ],
                        [
                            66491.9466832115,
                            65294.22789670731
                        ]
                    ],
                    [
                        [
                            66491.79994312163,
                            65294.582158622434
                        ],
                        [
                            66491.09141929138,
                            65293.87363479218
                        ]
                    ],
                    [
                        [
                            66491.55891480307,
                            65293.97639735912
                        ],
                        [
                            66491.44568346329,
                            65294.57430217817
                        ]
                    ],
                    [
                        [
                            66491.33244438343,
                            65293.97639883123
                        ],
                        [
                            66491.3313382054,
                            65293.96231075452
                        ],
                        [
                            66491.33268200097,
                            65293.9482433543
                        ],
                        [
                            66491.33643537633,
                            65293.93461948889
                        ],
                        [
                            66491.34248550712,
                            65293.921848684186
                        ],
                        [
                            66491.35065052973,
                            65293.910314823544
                        ],
                        [
                            66491.36068500805,
                            65293.90036460847
                        ],
                        [
                            66491.37228731121,
                            65293.892297136954
                        ],
                        [
                            66491.38510868036,
                            65293.88635491275
                        ],
                        [
                            66491.3987637122,
                            65293.88271655585
                        ],
                        [
                            66491.41284194398,
                            65293.881491433254
                        ]
                    ],
                    [
                        [
                            66491.47851597195,
                            65293.88149101111
                        ],
                        [
                            66491.41284192754,
                            65293.881491461754
                        ]
                    ],
                    [
                        [
                            66491.44568346329,
                            65294.57430217817
                        ],
                        [
                            66491.33244434869,
                            65293.9763988433
                        ]
                    ],
                    [
                        [
                            66491.4785159884,
                            65293.881490982596
                        ],
                        [
                            66491.49259423623,
                            65293.882715920816
                        ],
                        [
                            66491.50624931572,
                            65293.88635409888
                        ],
                        [
                            66491.51907076269,
                            65293.89229615517
                        ],
                        [
                            66491.53067317151,
                            65293.900363474735
                        ],
                        [
                            66491.54070778015,
                            65293.910313558394
                        ],
                        [
                            66491.5488729538,
                            65293.92184731211
                        ],
                        [
                            66491.55492325184,
                            65293.93461803758
                        ],
                        [
                            66491.55867680564,
                            65293.94824185383
                        ],
                        [
                            66491.56002078541,
                            65293.96230923645
                        ],
                        [
                            66491.55891479191,
                            65293.97639732766
                        ]
                    ]
                ]
            }-66491.4456812-65294.2278967
*/
private Geometry point(Geometry geometry,String name){
	String s = CadTemplate.CadTemplateAccessors.get(name);
	//s0 为图形模板 s1 为x偏移量 s2 y偏移量
	String[] split = s.split("-");
	Geometry geometryNew  =ogr.CreateGeometryFromJson(split[0]);
	double[] doubles = geometry.GetPoint(0);
	int i = geometryNew.GetGeometryCount();
	for (int j = 0; j <i ; j++) {
		Geometry geometry1 = geometryNew.GetGeometryRef(j);
		int i1 = geometry1.GetPointCount();
		for (int k = 0; k <i1 ; k++) {
			double v = geometry1.GetX(k);
			double v1 = geometry1.GetY(k);
			geometry1.SetPoint(k,(v-Double.valueOf(split[1]))+doubles[0],(v1-Double.valueOf(split[2]))+doubles[1]);
		}
		geometryNew.AddGeometry(geometry1);
	}
	return geometryNew;
}

4.Layer

图层

  • 创建layer 一个spatial 和 layerName
SpatialReference spatialReference = new SpatialReference();
spatialReference.ImportFromEPSG(parseOptions.getSrid());
Layer wellLayer = memSource.CreateLayer(Contants.WELL, spatialReference);
  • 图层中搜索
markLayer.ResetReading();
//重置过滤
markLayer.SetSpatialFilter(null);
markLayer.SetSpatialFilterRect(expanded[0], expanded[1], expanded[2], expanded[3]);
  • 添加feature
wellLayer.CreateFeature(newFeature);

5.Driver

基于不同的Driver创建不同类型的datasource,类比于不同类型的数据源
dxf驱动则创建dxf文件格式的数据源
Memory驱动则创建基于内存的数据源
数据源本质上只是一个存储数据的位置,不局限于所使用的功能,都可以用来生成layer feature

Driver driver = ogr.GetDriverByName("DXF");
if(null == driver)
	throw new NullPointerException("获取DXF驱动失败!");

DataSource dataSource = driver.CreateDataSource(file_path);
if(null == dataSource)
	throw new NullPointerException("DataSource创建失败!");
//内存驱动
Driver memDriver = ogr.GetDriverByName("Memory");
DataSource memSource = memDriver.CreateDataSource(String.valueOf(Math.random()));

// gdal坐标系 SpatialReference
SpatialReference spatialReference = new SpatialReference();
spatialReference.ImportFromEPSG(4326);
String layer0 = "Layer";
// 创建一个Layer。dxf中可以创建多个Layer
Layer layer = dataSource.CreateLayer(layer0,spatialReference);



6示例

  • 在管的上方设施管径属性的标记点 特殊的feature样式

double[] doubles0 = geometryType.GetPoint(0);
double[] doubles1 = geometryType.GetPoint(1);
double v0 = (doubles1[0]+doubles0[0])/2;
double v1 = (doubles1[1]+doubles0[1])/2;
double x = doubles1[0]-doubles0[0];
double y=   doubles1[1]-doubles0[1];
double v = Math.atan2(y, x);
v= Math.toDegrees(v);

if (simpleFeature.getAttribute("pipe_diameter")!=null){
	Geometry geometry = ogr.CreateGeometryFromWkt("POINT("+(doubles0[0]+v0)/2+" "+(doubles0[1]+v1)/2+")");
	Feature feature1 = new Feature(featureDefn);
	feature1.SetField("Layer", "GJ");
	feature1.SetStyleString("LABEL(f:\"Times New Roman\",s:1050px,t:{"+simpleFeature.getAttribute("pipe_diameter")+"},a:"+v+",c:#FF3300,p:3)");
	feature1.SetGeometry(geometry);
	layer.CreateFeature(feature1);
}
posted @ 2022-07-01 10:54  zl20110000  阅读(680)  评论(0)    收藏  举报
页脚测试
zl test:::