Клуб API Карт

Изменился ответ геокодера

Павел Гуров
5 февраля 2016, 12:13

Набдаю странную ситуацию, о которой ничего нет в вашей документации. Использую метод http://geocode-maps.yandex.ru/1.x для определения адреса по координатам. Ответ например для города Владимир похож на тот, что в документации

{
  "response": {
    "GeoObjectCollection": {
      "metaDataProperty": {
        "GeocoderResponseMetaData": {
          "request": "40.4162,56.1345",
          "found": "96",
          "results": "1",
          "boundedBy": {
            "Envelope": {
              "lowerCorner": "40.413704 56.132002",
              "upperCorner": "40.418699 56.136999"
            }
          },
          "Point": {
            "pos": "40.416200 56.134500"
          },
          "kind": "house"
        }
      },
      "featureMember": [
        {
          "GeoObject": {
            "metaDataProperty": {
              "GeocoderMetaData": {
                "kind": "house",
                "text": "Россия, Владимир, улица Чехова, 10",
                "precision": "exact",
                "AddressDetails": {
                  "Country": {
                    "AddressLine": "Владимир, улица Чехова, 10",
                    "CountryNameCode": "RU",
                    "CountryName": "Россия",
                    "AdministrativeArea": {
                      "AdministrativeAreaName": "Владимирская область",
                      "SubAdministrativeArea": {
                        "SubAdministrativeAreaName": "городской округ Владимир",
                        "Locality": {
                          "LocalityName": "Владимир",
                          "Thoroughfare": {
                            "ThoroughfareName": "улица Чехова",
                            "Premise": {
                              "PremiseNumber": "10"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            },
            "description": "Владимир, Россия",
            "name": "улица Чехова, 10",
            "boundedBy": {
              "Envelope": {
                "lowerCorner": "40.407623 56.129745",
                "upperCorner": "40.42408 56.138935"
              }
            },
            "Point": {
              "pos": "40.415851 56.13434"
            }
          }
        }
      ]
    }
  }
}

Но вот для Москвы почему то в ответе отсутствует ключ SubAdministrativeArea и Locality вкладывается прямо в AdministrativeArea. Вот как это выглядит

{
  "response": {
    "GeoObjectCollection": {
      "metaDataProperty": {
        "GeocoderResponseMetaData": {
          "request": "37.6071,55.7645",
          "found": "89",
          "results": "1",
          "boundedBy": {
            "Envelope": {
              "lowerCorner": "37.604601 55.762004",
              "upperCorner": "37.609595 55.766997"
            }
          },
          "Point": {
            "pos": "37.607100 55.764500"
          },
          "kind": "house"
        }
      },
      "featureMember": [
        {
          "GeoObject": {
            "metaDataProperty": {
              "GeocoderMetaData": {
                "kind": "house",
                "text": "Россия, Москва, Тверская улица, 16с1",
                "precision": "exact",
                "AddressDetails": {
                  "Country": {
                    "AddressLine": "Москва, Тверская улица, 16с1",
                    "CountryNameCode": "RU",
                    "CountryName": "Россия",
                    "AdministrativeArea": {
                      "AdministrativeAreaName": "Москва",
                      "Locality": {
                        "LocalityName": "Москва",
                        "Thoroughfare": {
                          "ThoroughfareName": "Тверская улица",
                          "Premise": {
                            "PremiseNumber": "16с1"
                          }
                        }
                      }
                    }
                  }
                }
              }
            },
            "description": "Москва, Россия",
            "name": "Тверская улица, 16с1",
            "boundedBy": {
              "Envelope": {
                "lowerCorner": "37.598762 55.760023",
                "upperCorner": "37.615219 55.769302"
              }
            },
            "Point": {
              "pos": "37.60699 55.764663"
            }
          }
        }
      ]
    }
  }
}

Вот ваша документация по ответу метода https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/response_structure-docpage/ 

В ней есть пример именно для Москвы, и в этом примере все по-нормальному, а не так как отвечает метод сейчас. Я использовал этот API в мобильном приложении, и теперь у всех его пользователей в Москве не работает определение адреса. Прокомментируйте пожалуйста ситуацию, может быть я что-то упустил?

8 комментариев
Наличие SubAdministrativeArea xAL не обещает, а Москва у нас это такая провинция.
Пример поправим.
Павел Гуров
5 февраля 2016, 19:54
Все эти ключи (Country, AdministrativeArea, SubAdministrativeArea, Locality, Thoroughfare, Premise) содержат друг друга вложенно, а не находятся на одном уровне, вам не кажется что пропуск одного из уровней затрудняет парс ответа? Получается что формат ответа не детерминирован, например Locality может находится как в AdministrativeArea так и в SubAdministrativeArea.

Ну а вообще мой вопрос не в этом, мой вопрос в следующем - как получилось так, что раньше всегда на все адреса был формат вложения Country -> AdministrativeArea -> SubAdministrativeArea -> Locality а теперь вдруг на некоторые адреса стал Country -> AdministrativeArea -> Locality? Вы понимаете, что это изменение обратно несовместимо, а вы просто взяли и в версии 1.x поменяли формат для некоторых адресов?
Павел Гуров,
Мне отлично известно про все недостатки формата xAL, и неудобство работы с ним.
Однако геокодер 1.x использует его и вроде бы не выходит за его рамки.
Что касается уровней вложенности, то он может меняться в зависимости от конкретного топонима, например, для городов федерального значения – Москва, Севостополь
Павел Гуров
5 февраля 2016, 20:00
Если же вы не меняли ничего в самом формате выдаче, а просто поменяли данные, и Москва стала AdministrativeArea вместо SubAdministrativeArea, это не меняет результата - получается, что ответ сервера остается неопределенным, формат будет один для одного адреса, и другой для другого, это крайне неудобно. Я конечно переписал свой парсер, и теперь он вытаскивает адрес как бы вы там его в итоге не вложили. Я уверен, что не у меня одного возникла данная прроблема, не понимаю почему до сих пор все молчат.
Павел Гуров,
А чего говорить, якарты идут своей дорогой, фиас-кладр им не указ,
собственные названия названия улиц населенных пуктов, топонимы тасуют как хотят, деревни села становятся поселками, с новой москвой так вообще (бип) - улицы н/п физически входят к какое либо поселение https://maps.yandex.ru/-/CVDp787C однако адрес просто москва, xxxx (https://geocode-maps.yandex.ru/1.x/?geocode=37.202547,55.537109)
появляются новые адреса придуманные из "торговых названий" https://maps.yandex.ru/-/CVDp7WYK итд. итп.
я уже наверно со счета сбился какая у меня версия парсера ответа геокодера за 4 года

ps: кудаб крестьянину податься (С)
Да *** полный.  Ругаться хочется. Я задолбался придумывать парсер, который будет различать район от микрорайона и районов городов федерального значения и обычных! Никакой систематизации и определенности в уровнях вложенности. Хаос и анархия!
Даже в OSM уровни районов внутри городов фед значения СПБ и МСК РАЗНЫЕ!! КАК!? Ониже оба гфз.... крик души. 
yunus-d,
GeocoderResult должен упростить задачу
dimik,
да не поможет, пробовал. 
1. 'getAdministrativeAreas()' районов не содержит. 

2. 'geoObjects' с kind:"district" выдает 2 объекта объекта:

get(0).getLocalities() - с микрорайоном

get(1).getLocalities() - с районом. 

3. Если выбирать всегда get(1) - не у всех районов есть микрорайоны - приходит пустой ответ. А возиться с if(){ }else{} как-то не правильно в этом случае, тем более, что не в одном городе придется собирать данные а это только с одним проблема. 


Это совсем не тот вариант когда надо предоставить все, что есть в одном уровне. Следует разделить эти объекты по разным уровням. Так что разочарование продолжается. 
Обновлено 9 января, 17:50