我正在尝试使用System.Data.Entity程序集中的System.Data.Spatial.DbGeometry.FromGml()
,但我无法使用简单的测试用例。
[Test]
public void DbGeometry_FromGml()
{
StringBuilder xml = new StringBuilder();
xml.Append(@"<gml:PolygonPatch>");
xml.Append(@"<gml:exterior>");
xml.Append(@"<gml:Ring>");
xml.Append(@"<gml:curveMember>");
xml.Append(@"<gml:segments>");
xml.Append(@"<gml:GeodesicString>");
xml.Append(@"<gml:posList> -25.07842078 124.85121167 -24.07829967 114.86532597 </gml:posList>");
xml.Append(@"</gml:GeodesicString>");
xml.Append(@"</gml:segments>");
xml.Append(@"</gml:curveMember>");
xml.Append(@"</gml:Ring>");
xml.Append(@"</gml:exterior>");
xml.Append(@"</gml:PolygonPatch>");
DbGeometry g = DbGeometry.FromGml(xml.ToString());
}
这给了我一个例外,'gml'是未声明的前缀。我向PolygonPatch添加了一些XML命名空间:xmlns:gml=\"http://www.opengis.net/gml/3.2\"
然后我得到一个不同的错误(如果我删除gml:
前缀而不是定义它,则会出现相同的错误):
Test.UnitTests.DbGeometry_FromGml:
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> System.FormatException : 24129: The given XML instance is not valid because the top-level tag is PolygonPatch. The top-level element of the input Geographic Markup Language (GML) must contain a Point, LineString, Polygon, MultiPoint, MultiGeometry, MultiCurve, MultiSurface, Arc, ArcString, CompositeCurve, PolygonPatch or FullGlobe (geography Data Type only) object.
因为它说顶级元素必须contain
一个PolygonPatch我尝试将它包装在父节点中(并将名称空间移动到父节点),但它没有任何区别。
所以我很困惑:这种方法的GML需要看起来像什么?
更新 尝试了一个更简单的对象(Point)并遇到了类似的问题。我从文本中创建了一个DbGeometry,然后将其转换为GML,它与我的输入不同,所以我认为它可能与GML版本有关。
DbGeometry point = DbGeometry.FromText("POINT (0 0)");
string gml = point.AsGml();
System.Console.WriteLine(gml);
输出
<?xml version="1.0" encoding="utf-8"?><Point xmlns="http://www.opengis.net/gml"><pos>0 0</pos></Point>
因此,Point包含<pos>
而不是<coordinates>