Mapbox GL and .net core webApi










0















I am moving from Leaflet to Mapbox GL and have some data issues. My webApi is proven but I cannot smoothly integrate them.



The approach I gave up on, based upon their examples and my own research, looks like:



 map = new mapboxgl.Map(
container: 'mapdiv',
style: 'mapbox://styles/mapbox/streets-v10'
, center: start
, zoom: $scope.zoom
, transformRequest: (url, resourceType) =>
if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
return
headers:
'Authorization': 'Bearer ' + localStorageService.get("authorizationData")
, 'Access-Control-Allow-Origin': CONFIG.APP_URL
, 'Access-Control-Allow-Credentials': 'true'




);


This is passing my OAuth2 token (or at least I think it should be) and the Cross site scripting part CORS.



Accompanying the above with:



map.addSource(layerName, type: 'geojson', url: getLayerURL($scope.remLayers[i]) );
map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


Having also tried to no avail:



map.addSource(layerName, "type": 'geojson', "data": "type": "FeatureCollection", "features": );
map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


Although there are no errors Fiddler does not show any requests being made to my layer webApi. All the others show but Mapbox does not appear to raising them.



The Url looks like:
http://localhost:49198/api/layer/?bbox=36.686654090881355,34.72821077223763,36.74072742462159,34.73664000652042&dtype=l&id=cf0e1df7-9510-4d03-9319-d4a1a7d6646d&sessionId=9a7d7daf-76fc-4dd8-af4f-b55d341e60e4



Because this was not working I attempted to make it more manual using my existing $http calls which partially works.



map = new mapboxgl.Map(
container: 'mapdiv',
style: 'mapbox://styles/mapbox/streets-v10'
, center: start
, zoom: $scope.zoom
, transformRequest: (url, resourceType) =>
if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
return
headers:
'Authorization': 'Bearer ' + localStorageService.get("authorizationData")




);

map.addSource(layerName,

"type": 'geojson',
"data": "type": "FeatureCollection", "features":
);


The tricky part is to know when to run the data retrieval call. The only place I could find was on the maps data event which now looks like:



map.on('data', function (e) 
if (e.dataType === 'source' && e.isSourceLoaded === false && e.tile === undefined)
// See if the datasource is known
for (var i = 0; i < $scope.remLayers.length; i++)
if (e.sourceId === $scope.remLayers[i].name)
askForData(i)



);

function askForData(i)
var data = getBBoxString(map);
var mapZoomLevel = map.getZoom();
if (checkZoom(mapZoomLevel, $scope.remLayers[i].minZoom, $scope.remLayers[i].maxZoom))
mapWebSvr.getData(
bbox: data, dtype: 0, id: $scope.remLayers[i].id, buffer: $scope.remLayers[i].isBuffer, sessionId
,
function (data, indexValue, indexType)
showNewData(data, indexValue, indexType);
,
function ()
// Not done yet.
,
i,
0
);



function showNewData(ajxresponse, index, indexType)
map.getSource($scope.remLayers[index].name).setData(ajxresponse);
map.getSource($scope.remLayers[index].name).isSourceLoaded = true;



This is all working with one exception. It keeps firing time and time again. Some of these calls return a lot of data for a web call so its not a solution at the moment.
Its like its never satisfied with the data even though its showing it on the map!
There is a parameter on the data event, isSourceLoaded but it does not get set to true.
I have searched for an example, have tried setting isSourceLoaded in a number of places (as with the code above) but to no avail.



Does anyone have a method accomplishing this basic data retrieval function successfully or can point out the error(s) in my code? Or even point me to a working example...



I have spent too long on this now and could do with some help.










share|improve this question


























    0















    I am moving from Leaflet to Mapbox GL and have some data issues. My webApi is proven but I cannot smoothly integrate them.



    The approach I gave up on, based upon their examples and my own research, looks like:



     map = new mapboxgl.Map(
    container: 'mapdiv',
    style: 'mapbox://styles/mapbox/streets-v10'
    , center: start
    , zoom: $scope.zoom
    , transformRequest: (url, resourceType) =>
    if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
    return
    headers:
    'Authorization': 'Bearer ' + localStorageService.get("authorizationData")
    , 'Access-Control-Allow-Origin': CONFIG.APP_URL
    , 'Access-Control-Allow-Credentials': 'true'




    );


    This is passing my OAuth2 token (or at least I think it should be) and the Cross site scripting part CORS.



    Accompanying the above with:



    map.addSource(layerName, type: 'geojson', url: getLayerURL($scope.remLayers[i]) );
    map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


    Having also tried to no avail:



    map.addSource(layerName, "type": 'geojson', "data": "type": "FeatureCollection", "features": );
    map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


    Although there are no errors Fiddler does not show any requests being made to my layer webApi. All the others show but Mapbox does not appear to raising them.



    The Url looks like:
    http://localhost:49198/api/layer/?bbox=36.686654090881355,34.72821077223763,36.74072742462159,34.73664000652042&dtype=l&id=cf0e1df7-9510-4d03-9319-d4a1a7d6646d&sessionId=9a7d7daf-76fc-4dd8-af4f-b55d341e60e4



    Because this was not working I attempted to make it more manual using my existing $http calls which partially works.



    map = new mapboxgl.Map(
    container: 'mapdiv',
    style: 'mapbox://styles/mapbox/streets-v10'
    , center: start
    , zoom: $scope.zoom
    , transformRequest: (url, resourceType) =>
    if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
    return
    headers:
    'Authorization': 'Bearer ' + localStorageService.get("authorizationData")




    );

    map.addSource(layerName,

    "type": 'geojson',
    "data": "type": "FeatureCollection", "features":
    );


    The tricky part is to know when to run the data retrieval call. The only place I could find was on the maps data event which now looks like:



    map.on('data', function (e) 
    if (e.dataType === 'source' && e.isSourceLoaded === false && e.tile === undefined)
    // See if the datasource is known
    for (var i = 0; i < $scope.remLayers.length; i++)
    if (e.sourceId === $scope.remLayers[i].name)
    askForData(i)



    );

    function askForData(i)
    var data = getBBoxString(map);
    var mapZoomLevel = map.getZoom();
    if (checkZoom(mapZoomLevel, $scope.remLayers[i].minZoom, $scope.remLayers[i].maxZoom))
    mapWebSvr.getData(
    bbox: data, dtype: 0, id: $scope.remLayers[i].id, buffer: $scope.remLayers[i].isBuffer, sessionId
    ,
    function (data, indexValue, indexType)
    showNewData(data, indexValue, indexType);
    ,
    function ()
    // Not done yet.
    ,
    i,
    0
    );



    function showNewData(ajxresponse, index, indexType)
    map.getSource($scope.remLayers[index].name).setData(ajxresponse);
    map.getSource($scope.remLayers[index].name).isSourceLoaded = true;



    This is all working with one exception. It keeps firing time and time again. Some of these calls return a lot of data for a web call so its not a solution at the moment.
    Its like its never satisfied with the data even though its showing it on the map!
    There is a parameter on the data event, isSourceLoaded but it does not get set to true.
    I have searched for an example, have tried setting isSourceLoaded in a number of places (as with the code above) but to no avail.



    Does anyone have a method accomplishing this basic data retrieval function successfully or can point out the error(s) in my code? Or even point me to a working example...



    I have spent too long on this now and could do with some help.










    share|improve this question
























      0












      0








      0








      I am moving from Leaflet to Mapbox GL and have some data issues. My webApi is proven but I cannot smoothly integrate them.



      The approach I gave up on, based upon their examples and my own research, looks like:



       map = new mapboxgl.Map(
      container: 'mapdiv',
      style: 'mapbox://styles/mapbox/streets-v10'
      , center: start
      , zoom: $scope.zoom
      , transformRequest: (url, resourceType) =>
      if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
      return
      headers:
      'Authorization': 'Bearer ' + localStorageService.get("authorizationData")
      , 'Access-Control-Allow-Origin': CONFIG.APP_URL
      , 'Access-Control-Allow-Credentials': 'true'




      );


      This is passing my OAuth2 token (or at least I think it should be) and the Cross site scripting part CORS.



      Accompanying the above with:



      map.addSource(layerName, type: 'geojson', url: getLayerURL($scope.remLayers[i]) );
      map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


      Having also tried to no avail:



      map.addSource(layerName, "type": 'geojson', "data": "type": "FeatureCollection", "features": );
      map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


      Although there are no errors Fiddler does not show any requests being made to my layer webApi. All the others show but Mapbox does not appear to raising them.



      The Url looks like:
      http://localhost:49198/api/layer/?bbox=36.686654090881355,34.72821077223763,36.74072742462159,34.73664000652042&dtype=l&id=cf0e1df7-9510-4d03-9319-d4a1a7d6646d&sessionId=9a7d7daf-76fc-4dd8-af4f-b55d341e60e4



      Because this was not working I attempted to make it more manual using my existing $http calls which partially works.



      map = new mapboxgl.Map(
      container: 'mapdiv',
      style: 'mapbox://styles/mapbox/streets-v10'
      , center: start
      , zoom: $scope.zoom
      , transformRequest: (url, resourceType) =>
      if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
      return
      headers:
      'Authorization': 'Bearer ' + localStorageService.get("authorizationData")




      );

      map.addSource(layerName,

      "type": 'geojson',
      "data": "type": "FeatureCollection", "features":
      );


      The tricky part is to know when to run the data retrieval call. The only place I could find was on the maps data event which now looks like:



      map.on('data', function (e) 
      if (e.dataType === 'source' && e.isSourceLoaded === false && e.tile === undefined)
      // See if the datasource is known
      for (var i = 0; i < $scope.remLayers.length; i++)
      if (e.sourceId === $scope.remLayers[i].name)
      askForData(i)



      );

      function askForData(i)
      var data = getBBoxString(map);
      var mapZoomLevel = map.getZoom();
      if (checkZoom(mapZoomLevel, $scope.remLayers[i].minZoom, $scope.remLayers[i].maxZoom))
      mapWebSvr.getData(
      bbox: data, dtype: 0, id: $scope.remLayers[i].id, buffer: $scope.remLayers[i].isBuffer, sessionId
      ,
      function (data, indexValue, indexType)
      showNewData(data, indexValue, indexType);
      ,
      function ()
      // Not done yet.
      ,
      i,
      0
      );



      function showNewData(ajxresponse, index, indexType)
      map.getSource($scope.remLayers[index].name).setData(ajxresponse);
      map.getSource($scope.remLayers[index].name).isSourceLoaded = true;



      This is all working with one exception. It keeps firing time and time again. Some of these calls return a lot of data for a web call so its not a solution at the moment.
      Its like its never satisfied with the data even though its showing it on the map!
      There is a parameter on the data event, isSourceLoaded but it does not get set to true.
      I have searched for an example, have tried setting isSourceLoaded in a number of places (as with the code above) but to no avail.



      Does anyone have a method accomplishing this basic data retrieval function successfully or can point out the error(s) in my code? Or even point me to a working example...



      I have spent too long on this now and could do with some help.










      share|improve this question














      I am moving from Leaflet to Mapbox GL and have some data issues. My webApi is proven but I cannot smoothly integrate them.



      The approach I gave up on, based upon their examples and my own research, looks like:



       map = new mapboxgl.Map(
      container: 'mapdiv',
      style: 'mapbox://styles/mapbox/streets-v10'
      , center: start
      , zoom: $scope.zoom
      , transformRequest: (url, resourceType) =>
      if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
      return
      headers:
      'Authorization': 'Bearer ' + localStorageService.get("authorizationData")
      , 'Access-Control-Allow-Origin': CONFIG.APP_URL
      , 'Access-Control-Allow-Credentials': 'true'




      );


      This is passing my OAuth2 token (or at least I think it should be) and the Cross site scripting part CORS.



      Accompanying the above with:



      map.addSource(layerName, type: 'geojson', url: getLayerURL($scope.remLayers[i]) );
      map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


      Having also tried to no avail:



      map.addSource(layerName, "type": 'geojson', "data": "type": "FeatureCollection", "features": );
      map.getSource(layerName).setData(getLayerURL($scope.remLayers[i]));


      Although there are no errors Fiddler does not show any requests being made to my layer webApi. All the others show but Mapbox does not appear to raising them.



      The Url looks like:
      http://localhost:49198/api/layer/?bbox=36.686654090881355,34.72821077223763,36.74072742462159,34.73664000652042&dtype=l&id=cf0e1df7-9510-4d03-9319-d4a1a7d6646d&sessionId=9a7d7daf-76fc-4dd8-af4f-b55d341e60e4



      Because this was not working I attempted to make it more manual using my existing $http calls which partially works.



      map = new mapboxgl.Map(
      container: 'mapdiv',
      style: 'mapbox://styles/mapbox/streets-v10'
      , center: start
      , zoom: $scope.zoom
      , transformRequest: (url, resourceType) =>
      if (resourceType === 'Source' && url.startsWith(CONFIG.API_URL))
      return
      headers:
      'Authorization': 'Bearer ' + localStorageService.get("authorizationData")




      );

      map.addSource(layerName,

      "type": 'geojson',
      "data": "type": "FeatureCollection", "features":
      );


      The tricky part is to know when to run the data retrieval call. The only place I could find was on the maps data event which now looks like:



      map.on('data', function (e) 
      if (e.dataType === 'source' && e.isSourceLoaded === false && e.tile === undefined)
      // See if the datasource is known
      for (var i = 0; i < $scope.remLayers.length; i++)
      if (e.sourceId === $scope.remLayers[i].name)
      askForData(i)



      );

      function askForData(i)
      var data = getBBoxString(map);
      var mapZoomLevel = map.getZoom();
      if (checkZoom(mapZoomLevel, $scope.remLayers[i].minZoom, $scope.remLayers[i].maxZoom))
      mapWebSvr.getData(
      bbox: data, dtype: 0, id: $scope.remLayers[i].id, buffer: $scope.remLayers[i].isBuffer, sessionId
      ,
      function (data, indexValue, indexType)
      showNewData(data, indexValue, indexType);
      ,
      function ()
      // Not done yet.
      ,
      i,
      0
      );



      function showNewData(ajxresponse, index, indexType)
      map.getSource($scope.remLayers[index].name).setData(ajxresponse);
      map.getSource($scope.remLayers[index].name).isSourceLoaded = true;



      This is all working with one exception. It keeps firing time and time again. Some of these calls return a lot of data for a web call so its not a solution at the moment.
      Its like its never satisfied with the data even though its showing it on the map!
      There is a parameter on the data event, isSourceLoaded but it does not get set to true.
      I have searched for an example, have tried setting isSourceLoaded in a number of places (as with the code above) but to no avail.



      Does anyone have a method accomplishing this basic data retrieval function successfully or can point out the error(s) in my code? Or even point me to a working example...



      I have spent too long on this now and could do with some help.







      asp.net-core-webapi mapbox-gl-js






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 13 '18 at 11:21









      NAJNAJ

      11




      11






















          1 Answer
          1






          active

          oldest

          votes


















          0














          After a bit of a run around I have a solution.
          A Mapbox email pointed to populating the data in the load event - which I am now doing.
          This was not however the solution I was looking for as the data needs refreshing when the map moves, zooms etc - further look ups are required.
          Following a bit more a examination a solution was found.
          Using the code blow on the render event will request the information when the bounding box is changed.



           var renderStaticBounds = getBoundsString(map.getBounds());
          map.on('render', function (e)
          if (renderStaticBounds != getBoundsString(map.getBounds()))
          renderStaticBounds = getBoundsString(map.getBounds());
          for (var i = 0; i < $scope.remLayers.length; i++)
          askForData(i);


          );
          function getBoundsString(mapBounds)
          var left = mapBounds._sw.lng;
          var bottom = mapBounds._sw.lat;
          var right = mapBounds._ne.lng;
          var top = mapBounds._ne.lat;
          return left + ',' + bottom + ',' + right + ',' + top;



          This hopefully will save someone some development time.






          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53279930%2fmapbox-gl-and-net-core-webapi%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            After a bit of a run around I have a solution.
            A Mapbox email pointed to populating the data in the load event - which I am now doing.
            This was not however the solution I was looking for as the data needs refreshing when the map moves, zooms etc - further look ups are required.
            Following a bit more a examination a solution was found.
            Using the code blow on the render event will request the information when the bounding box is changed.



             var renderStaticBounds = getBoundsString(map.getBounds());
            map.on('render', function (e)
            if (renderStaticBounds != getBoundsString(map.getBounds()))
            renderStaticBounds = getBoundsString(map.getBounds());
            for (var i = 0; i < $scope.remLayers.length; i++)
            askForData(i);


            );
            function getBoundsString(mapBounds)
            var left = mapBounds._sw.lng;
            var bottom = mapBounds._sw.lat;
            var right = mapBounds._ne.lng;
            var top = mapBounds._ne.lat;
            return left + ',' + bottom + ',' + right + ',' + top;



            This hopefully will save someone some development time.






            share|improve this answer



























              0














              After a bit of a run around I have a solution.
              A Mapbox email pointed to populating the data in the load event - which I am now doing.
              This was not however the solution I was looking for as the data needs refreshing when the map moves, zooms etc - further look ups are required.
              Following a bit more a examination a solution was found.
              Using the code blow on the render event will request the information when the bounding box is changed.



               var renderStaticBounds = getBoundsString(map.getBounds());
              map.on('render', function (e)
              if (renderStaticBounds != getBoundsString(map.getBounds()))
              renderStaticBounds = getBoundsString(map.getBounds());
              for (var i = 0; i < $scope.remLayers.length; i++)
              askForData(i);


              );
              function getBoundsString(mapBounds)
              var left = mapBounds._sw.lng;
              var bottom = mapBounds._sw.lat;
              var right = mapBounds._ne.lng;
              var top = mapBounds._ne.lat;
              return left + ',' + bottom + ',' + right + ',' + top;



              This hopefully will save someone some development time.






              share|improve this answer

























                0












                0








                0







                After a bit of a run around I have a solution.
                A Mapbox email pointed to populating the data in the load event - which I am now doing.
                This was not however the solution I was looking for as the data needs refreshing when the map moves, zooms etc - further look ups are required.
                Following a bit more a examination a solution was found.
                Using the code blow on the render event will request the information when the bounding box is changed.



                 var renderStaticBounds = getBoundsString(map.getBounds());
                map.on('render', function (e)
                if (renderStaticBounds != getBoundsString(map.getBounds()))
                renderStaticBounds = getBoundsString(map.getBounds());
                for (var i = 0; i < $scope.remLayers.length; i++)
                askForData(i);


                );
                function getBoundsString(mapBounds)
                var left = mapBounds._sw.lng;
                var bottom = mapBounds._sw.lat;
                var right = mapBounds._ne.lng;
                var top = mapBounds._ne.lat;
                return left + ',' + bottom + ',' + right + ',' + top;



                This hopefully will save someone some development time.






                share|improve this answer













                After a bit of a run around I have a solution.
                A Mapbox email pointed to populating the data in the load event - which I am now doing.
                This was not however the solution I was looking for as the data needs refreshing when the map moves, zooms etc - further look ups are required.
                Following a bit more a examination a solution was found.
                Using the code blow on the render event will request the information when the bounding box is changed.



                 var renderStaticBounds = getBoundsString(map.getBounds());
                map.on('render', function (e)
                if (renderStaticBounds != getBoundsString(map.getBounds()))
                renderStaticBounds = getBoundsString(map.getBounds());
                for (var i = 0; i < $scope.remLayers.length; i++)
                askForData(i);


                );
                function getBoundsString(mapBounds)
                var left = mapBounds._sw.lng;
                var bottom = mapBounds._sw.lat;
                var right = mapBounds._ne.lng;
                var top = mapBounds._ne.lat;
                return left + ',' + bottom + ',' + right + ',' + top;



                This hopefully will save someone some development time.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 14 '18 at 11:21









                NAJNAJ

                11




                11



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53279930%2fmapbox-gl-and-net-core-webapi%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    How to read a connectionString WITH PROVIDER in .NET Core?

                    In R, how to develop a multiplot heatmap.2 figure showing key labels successfully

                    Museum of Modern and Contemporary Art of Trento and Rovereto