1

情况:我有 3 个网络参考(xMap、xLocation、xRoute)xMap 专用于生成地图。xLocation 专门用于定位地点。xRoute 专门用于生成路由。

我正在使用一个简单的 GUI 来显示地图并输入起点和终点路线的位置。

这些是我的错误。

错误 1 ​​无法将类型“Plantool.xRoute.LineString[]”隐式转换为“Plantool.xMap.LineString[]”

错误 2 'Plantool.xMap.XMapWSService.renderMapBoundingBox(Plantool.xMap.BoundingBox, Plantool.xMap.MapParams, Plantool.xMap.ImageInfo, Plantool.xMap.Layer[], bool, Plantool.xMap.CallerContext 的最佳重载方法匹配)' 有一些无效的参数

错误 3 参数“1”:无法从“Plantool.xRoute.BoundingBox”转换为“Plantool.xMap.BoundingBox”

我猜测 PTV xServer 的重复方法/功能/等与 xMap、xLocate、xRoute 是可选模块相同。这可能是一个简单的答案,有解决方案吗?

我正在寻找回家的长途旅行的头,并在此代码上花费额外的半小时加班上瘾。嗨,我是新来的。

低于他我的班。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Plantool.xMap;
using Plantool.xLocate;
using Plantool.xRoute;

namespace Plantool
{
    class ClassMap
    {
        /*
         * xServer clients
         */
        private static XMapWSService xMapClient = new XMapWSService();
        private static XRouteWSService xRouteClient = new XRouteWSService();
        private static XLocateWSService xLocateClient = new XLocateWSService();

        /* getLocation()
         * Input: Address string
         * Output: WKT (Well-Known-Text) Location
         * Edited 20/12/12 - Davide Nguyen
         */
        public string getLocation(string input)
        {
            // create the adress object
            string[] address = input.Split(',');
            Address addr = new Address();
            addr.country = address[0];
            addr.city = address[1];
            addr.postCode = address[2];

            // call findAddress on the xLocate server  
            // only the first argument of findAddress is mandatory,  
            // all others are nullable (see xLocate API documentation)
            AddressResponse response = xLocateClient.findAddress(addr, null, null, null, null);

            string result = "";
            foreach (ResultAddress ra in response.wrappedResultList)
            {
                result += String.Format("POINT( {0} {1}) ", ra.coordinates.point.x, ra.coordinates.point.y);
            }
            string result2 = result.Replace(",", ".");
            return result2;
        }

        /* route()
         * Input: Start address, Destination address
         * Output: string[] [0] DISTANCE [1] TIME [2] MAP
         * Edited 20/12/12 - Davide Nguyen
         */
        public string[] route(string startlocation, string destination)
        {
            #region WaypointDesc[]
            // create the WayPoint for the Start
            // ATTENTION: Here at the object WaypointDesc the parameters are not named
            // "coords" as described within the documentation but
            // "wrappedCoords"
            WaypointDesc wpdStart = new WaypointDesc();
            // please note that this has to be an array of Point...
            wpdStart.wrappedCoords = new xRoute.Point[] { new xRoute.Point() };
            wpdStart.wrappedCoords[0].wkt = getLocation(startlocation);

            // Waypoint for the Destination...
            WaypointDesc wpdDestination = new WaypointDesc();
            wpdDestination.wrappedCoords = new xRoute.Point[] { new xRoute.Point() };
            wpdDestination.wrappedCoords[0].wkt = getLocation(destination);

            // create a new array of WayPointDescriptions and fill it with Start and Destination
            WaypointDesc[] waypointDesc = new WaypointDesc[] { wpdStart, wpdDestination };
            #endregion

            try
            {
                // Route
                Route route = calculateRoute(waypointDesc);

                // Map
                string DisplayMapURL = createMap(waypointDesc, route);

                // get route info
                string[] routeinfo = getRouteInfo(waypointDesc);

                // Create the result
                string[] result = new string[3];
                result[0] = routeinfo[0]; // Distance
                result[1] = routeinfo[1]; // Time
                result[2] = DisplayMapURL;// Map URL

                // Return the result
                return result;
            }
            catch
            {
                throw new NotImplementedException();
            }
        }

        /* getRouteInfo()
         * Input: WaypointDesc[]
         * Output: string mapURL
         * Edited 20/12/12 - Davide Nguyen
         */
        private static string createMap(WaypointDesc[] waypointDesc, Route route)
        {
            #region boundingBox
            // Set boundingBox fand use corners from the calculated route
            xRoute.BoundingBox boundingBox = new xRoute.BoundingBox();
            boundingBox.leftTop = route.totalRectangle.rightTop;
            boundingBox.rightBottom = route.totalRectangle.leftBottom;
            #endregion

            #region mapParams
            // Build mapParams
            MapParams mapParams = new MapParams();
            mapParams.showScale = true;
            mapParams.useMiles = false;
            #endregion

            #region imageInfo
            // Create imageInfo and set the frame size and image format. NOTE: 1052; 863
            ImageInfo imageInfo = new ImageInfo();
            imageInfo.format = ImageFileFormat.PNG;
            imageInfo.height = 1052;
            imageInfo.width = 863;
            imageInfo.imageParameter = "";
            #endregion

            #region layers
            // Create a line from the calculated route
            xRoute.LineString[] lineStrings = new xRoute.LineString[] { route.polygon };
            Lines[] lines = new Lines[1];
            LineOptions options = new LineOptions();
            LinePartOptions partoptions = new LinePartOptions();
            partoptions.color = new Color();
            partoptions.visible = true;
            partoptions.width = -10;
            options.mainLine = partoptions;

            lines[0] = new Lines();
            lines[0].wrappedLines = lineStrings;                                                                                    //NEED HELP
            lines[0].options = options;

            // Define customLayer that contains the object lines and set layers.
            CustomLayer customLayer = new CustomLayer();
            customLayer.visible = true;
            customLayer.drawPriority = 100;
            customLayer.wrappedLines = lines;
            customLayer.objectInfos = ObjectInfoType.NONE;
            customLayer.centerObjects = true;
            Layer[] layers = new Layer[] { customLayer };
            #endregion

            #region includeImageInResponse
            // Set argument includeImageInResponse to false (default).
            Boolean includeImageInResponse = false;
            #endregion

            // Return object map using the following method.
            Map map = xMapClient.renderMapBoundingBox(boundingBox, mapParams, imageInfo, layers, includeImageInResponse, null);     // NEED HELP

            // Retrieve the image
            string result = "http://" + map.image.url;

            // Return the drawn map
            return result;
        }

        /* getRouteInfo()
         * Input: WaypointDesc[]
         * Output: string[] [0] Distance in M [1] Time in H:M:S:MS
         * Edited 20/12/12 - Davide Nguyen
         */
        private string[] getRouteInfo(WaypointDesc[] waypointDesc)
        {
            // Call the service
            RouteInfo routeInfo = xRouteClient.calculateRouteInfo(waypointDesc, null, null, null);

            // Create the result
            TimeSpan t = TimeSpan.FromSeconds(routeInfo.time);
            string[] result = new string[2];
            result[0] = string.Format("{0} KM", routeInfo.distance);
            result[1] = string.Format("{0:D2}h:{1:D2}m:{2:D2}s:{3:D3}ms", t.Hours, t.Minutes, t.Seconds, t.Milliseconds);

            // Return the result
            return result;
        }

        /* getRouteLines() 
         * Input: WaypointDesc[]
         * Output: Route object
         * Edited 20/12/12 - Davide Nguyen
         */
        private static Route calculateRoute(WaypointDesc[] waypointDesc)
        {
            #region ResultListOptions
            // Instantiate a new object resultListOPtions
            ResultListOptions resultListOptions = new ResultListOptions();
            resultListOptions.polygon = true;
            resultListOptions.totalRectangle = true;
            resultListOptions.detailLevel = DetailLevel.STANDARD;
            #endregion

            #region CallerContext/CallerContextPropery
            // Create a new CallerContextProperty object property
            xRoute.CallerContextProperty property = new xRoute.CallerContextProperty();
            property.key = "ResponseGeometry";
            property.value = "WKT";
            xRoute.CallerContext callerContext = new xRoute.CallerContext();
            callerContext.wrappedProperties = new xRoute.CallerContextProperty[] { property };
            #endregion

            // Call the service
            Route route = xRouteClient.calculateRoute(waypointDesc, null, null, resultListOptions, callerContext);

            return route;
        }

    }
}
4

3 回答 3

1

这两者之间似乎存在一些参考混淆。

using Plantool.xMap;
using Plantool.xRoute;

你可以删除这些:

using Plantool.xMap;
using Plantool.xLocate;
using Plantool.xRoute;

只需添加以下内容:

using Plantool;

然后显式引用正确的类型,确保您引用的是所需的类型。这应该解决所有三个错误消息。

理想情况下,您应该避免只有命名空间不同的名称冲突。在 .NET 框架中,您会注意到他们小心翼翼地避免这种情况,例如......

System.Data.Odbc.OdbcConnection
 System.Data.SqlClient.SqlConnection

Connection考虑到一个在Odbc命名空间中,一个在命名空间中,它们可能都被称为SqlClient—— 但这可能会导致您遇到的问题。

通过重命名LineStringRouteLineStringandMapLineString您可以避免应用程序中的混淆。

于 2012-12-20T16:39:02.960 回答
1

根据我对 xServer 的记忆,这是一个主要问题:xMap、xRoute 和 xLocate 中的常见类型不一样(就像你说的,因为它们是可选模块)。xMap.LineString实际上是与 不同的类型xRoute.LineString,即使它们具有相同的属性。您对此无能为力,除了:

  • 如果两种类型共享一个公共基类型或接口,请改用这个公共类型
  • 编写扩展方法以映射 fromxRoute.LineStringxLocate.LineString...等。

例如:

public static xLocate.LineString ToXLocateLineString(this xRoute.LineString lineString)
{
    return new xLocate.LineString
    {
        // Map type by copying properties
        ....
    };
}

所以你可以写

xRoute.LineString[] input = ....
xMap.LineString[] output = input.Select(z => z.ToXLocateLineString()).ToArray();

甚至

public static xLocate.LineString[] ToXLocateLineStringArray(this xRoute.LineString[] lineString)
{
    return lineString.Select(z => z.ToXLocateLineString()).ToArray();
}

然后

xMap.LineString[] output = input.ToXLocateLineStringArray();

也许他们改进了他们的 API,因为我最后一次使用它,对此不确定。

于 2012-12-21T15:07:49.093 回答
0

干杯,在我看来,冗余可以通过正确创建客户端类来解决。您可以使用 Visual Studio 的 WSDL.EXE 在一个步骤中合并 WSDL,而不是一个一个地添加三个 WSDL(通过 Visual Studio 向导)。这适用于 PTV xServer 1(在此线程中引用),甚至更好地适用于 xServer2 我通常做的是 CMD 语句,例如

WSDL /namespace:"XServer" /sharetypes /out:"XServer.cs" "https://xserver2-europe-eu-test.cloud.ptvgroup.com/services/ws/XLocate?wsdl" "https://xserver2 -europe-eu-test.cloud.ptvgroup.com/services/ws/XRoute?wsdl" "https://xserver2-europe-eu-test.cloud.ptvgroup.com/services/ws/XTour?wsdl"

将此视为一般建议。如今的映射接口完全不同。

于 2021-05-12T10:14:53.033 回答