cad dxf 文件解析
1.参考
Java调用开源GDAL解析dxf成shp,再调用开源GeoTools解析shp文件
1.Feature
- 创建
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);

- 获取定义字段的值
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

字段定义:key:type
new FieldDefn(Contants.START_CODE, ogr.OFTString);
点击查看代码
3.Geometry
图形类型:类似于mysql中的地理数据类型
//获取中心点 gemo
geometry.Centroid()
//定义不同的Geometry类型

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);
}

浙公网安备 33010602011771号