Выполнение цикла или итерации по защищенному веб-запросу для извлечения всех записей из службы функций ESRI с использованием C#

#c# #loops #webrequest #esri

#c# #циклы #веб-запрос #esri

Вопрос:

Я относительно новичок в C #. Я работаю над консольным приложением C # для синхронизации данных из ГИС в бизнес-систему. Наборы данных, которые я извлекаю из ГИС, больше, чем разрешенный набор записей, возвращенный при запросе службы. Ниже приведен мой код для извлечения данных из службы (URL изменен для публичного отображения). Есть ли способ, которым я могу выполнить цикл или итерацию по запросу, чтобы извлечь все записи для набора данных? Приведенный ниже код работает для извлечения первых 2000 записей набора данных.

общедоступная статическая строка MyData {

         get
        {
            var token = GetToken();
            string result = string.Empty;
            var url = new Uri("https://mydata.com/mapping/rest/services/GeoEvent/MyData/FeatureServer/0/query?where=0=0amp;text=amp;objectIds=amp;time=amp;geometry=amp;geometryType=esriGeometryEnvelopeamp;inSR=amp;spatialRel=esriSpatialRelIntersectsamp;relationParam=amp;outFields=OBJECTID,SIID,COLL_METHOD,COLL_STATUS,COLL_CMTS,CREATED_BY,CREATED_DATE,MODIFIED_BY,MODIFIED_DATE,SIDamp;returnGeometry=trueamp;returnTrueCurves=falseamp;maxAllowableOffset=amp;geometryPrecision=amp;outSR=4269amp;having=amp;returnIdsOnly=falseamp;returnCountOnly=falseamp;orderByFields=OBJECTIDamp;groupByFieldsForStatistics=amp;outStatistics=amp;returnZ=falseamp;returnM=falseamp;gdbVersion=amp;historicMoment=amp;returnDistinctValues=falseamp;resultOffset=amp;resultRecordCount=amp;queryByDistance=amp;returnExtentOnly=falseamp;datumTransformation=amp;parameterValues=amp;rangeValues=amp;quantizationParameters=amp;featureEncoding=esriDefaultamp;f=pjson");
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.Host = "mydata.com";
            httpWebRequest.Headers.Add("X-Esri-Authorization", "Bearer "   token);
            httpWebRequest.Method = "GET";
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                result = streamReader.ReadToEnd();
            }

                         
            Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(result);
             foreach(Feature featureitem in obj.features)
            {
                Console.WriteLine(featureitem.attributes.OBJECTID   "-"   featureitem.attributes.COLL_STATUS   "-"   featureitem.attributes.CREATED_BY   "-"   featureitem.attributes.CREATED_DATE   "-"   featureitem.attributes.MODIFIED_BY   "-"   featureitem.attributes.COLL_CMTS   "-"   featureitem.attributes.SID   "-"   featureitem.attributes.SIID   "-"   featureitem.geometry.x   "-"   featureitem.geometry.y);
            }
  

Комментарии:

1. «первые 2000 записей набора данных» — Что конкретно вызывает его остановку? Сколько элементов находится в obj.features коллекции при отладке?

2. Достигается значение maxAllowedRecords («exceededTransferLimit»: true), возвращаемое из запроса. Я могу вручную изменить смещение результата на 2000, чтобы получить следующую группу записей, но я бы предпочел выполнять цикл запроса до тех пор, пока не будут получены все записи. Для обсуждения, рассматриваемый набор данных содержит 5000 записей.

3. Если операция API возвращает только 2000 записей, то это все, что вы можете выполнить в цикле. Похоже, что вы хотите поместить весь этот фрагмент кода в больший цикл, чтобы выполнить несколько запросов к API. Где бы вы ни указали нужные записи из запроса API, это то, что вы изменили бы в этом цикле.

Ответ №1:

два варианта:

Запрос с returnIdsOnly = true. Это вернет все записи, но только их идентификаторы объектов. Оттуда вы можете запрашивать пакеты или отдельных лиц по идентификатору.

Запрос со resultOffset и resultRecordCount значениями. Первый запрос будет:

 ?resultOffset=0amp;resultRecordCount=1000
  

Следующим будет:

 ?resultOffset=1000amp;resultRecordCount=1000
  

и т. д

Комментарии:

1. Спасибо всем за ваши отзывы. Я знаю, что могу выполнить этот процесс вручную, но то, что я хотел бы сделать, это автоматизировать процесс, чтобы приложение запускалось (например, по ночам). Таким образом, не может быть никакого пользовательского ввода. Что я думал о том, чтобы сначала запросить количество записей, а затем использовать эту информацию для определения параметров и # запросов, необходимых для извлечения данных. Я просто застрял на связывании запросов вместе, поэтому вмешательство пользователя не требуется.

2. Вы также можете передавать эти параметры в своем коде; вам не нужно делать это интерактивно. Например, увеличивайте смещение до тех пор, пока не получите никаких результатов. Кроме того, вы можете рассмотреть возможность использования такого инструмента, как FME, который специально создан для такого рода задач (например, ежевечерняя загрузка и перевод объектов из картографического сервиса)