July 2, 2019, 1:18 p.m.

Как в карте получить номера домов и их координаты

Добрый день. У меня есть карта и я могу получить видимые координаты. Скажите пожалуйста, как определить номера домов и их координаты в видимой части карты? Возможно это можно получить с помощью свойства text

import QtQuick 2.12
import QtQuick.Window 2.12
import QtLocation 5.12
import QtPositioning 5.12
//console.log("открылась Page1") //вывод текста в консоль

Item {
    visible: true
    width: 480
    height: 720
    //    width: Screen.width
    //    height: Screen.height

    property double old : 19
    property double now


    Rectangle
    {
        anchors.fill: parent
        color: "#eee"

        /*Component.onCompleted:
        {
            circle.center = src.position.coordinate
            circle1.center = src.position.coordinate
            circle2.center = src.position.coordinate
            maps.center = src.position.coordinate
        }*/

        PositionSource
        {
            id: src
//            active: true
//            updateInterval: 1000
//            onPositionChanged:
//            {
//                console.log("PositionSource:" )
//                circle.center = position.coordinate
//                circle1.center = position.coordinate
//                circle2.center = position.coordinate
//            }
        }

        Address
        {
         id:  address
        }

        Plugin
        {
            id: plugin
            name: "osm"
            PluginParameter { name: "osm.useragent"; value: "My great Qt OSM application" }
            PluginParameter { name: "osm.mapping.host"; value: "http://osm.tile.server.address/" }
            PluginParameter { name: "osm.mapping.copyright"; value: "All mine" }
            PluginParameter { name: "osm.routing.host"; value: "http://osrm.server.address/viaroute" }
            PluginParameter { name: "osm.geocoding.host"; value: "http://geocoding.server.address" }
            PluginParameter { name: "osm.places.host"; value: "http://geocoding.server.address" }
        }

        Map
        {
            id: maps
            anchors.fill: parent
            plugin: plugin
            gesture.enabled: true
            gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture | MapGestureArea.FlickGesture
            gesture.flickDeceleration: 3000
            zoomLevel: 19
            center: QtPositioning.coordinate(59.91, 10.75) // Oslo

            onZoomLevelChanged:
            {
                console.log("onZoomLevelChanged:")
                console.log("coordinate ctnter:" + visibleRegion.center())
                console.log("coordinate geoshape:" + visibleRegion.boundingGeoRectangle())
            }

            onCenterChanged:
            {
                console.log("onCenterChanged:")
                console.log("coordinate ctnter:" + visibleRegion.center())
                console.log("coordinate geoshape:" + visibleRegion.boundingGeoRectangle())
                console.log("address:" )
            }

            minimumZoomLevel: 1

            focus: true

            /*MapCircle {
                id: circle
                z: 2
                color: "#fff"
                radius: 8
                border.color: "#fff"
                center
                {
                    latitude: src.position.coordinate.latitude
                    longitude: src.position.coordinate.longitude
                }
            }

            MapCircle {
                id: circle2
                z: 3
                color: "#0084ff"
                radius: 4
                border.color: "#0084ff"
                center
                {
                    latitude: src.position.coordinate.latitude
                    longitude: src.position.coordinate.longitude
                }
            }

            MapCircle {
                id: circle1
                z: 1
                color: "#0084ff"
                border.color: "#0084ff"
                opacity: 0.25
                radius: 19
                center
                {
                    latitude: src.position.coordinate.latitude
                    longitude: src.position.coordinate.longitude
                }
            }*/
        }
    }
}

10% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking
31

Добрый день!

Я думаю, что вы можете получить информацию об адресе следующим образом из объекта Address

console.log("address: " + address.street)

При этом сам номер дома по ходу придётся каким-то образом парсить из полученной строки. Судя по документации ни шиша там нету отдельной инофрмации по номеру дома.

А свойство text, собирает всё до кучи.

console.log("address: " + address.text)

Если делать так

console.log("address: " + address.street)

или так

console.log("address: " + address.text)

то ничего не возвращает. хотя если делать так

console.log("address:" + address.isTextGenerated)

то возвращает true. Этот код

console.log("address:" + address.objectName )

тоже ничего не возвращает.

Похоже я неправильно пользуюсь Address или он не работает.

Еще похоже можно как то по API получить координаты и номера домов , но как, я пока не понял. Вот нашел пример в ссылке https://nominatim.openstreetmap.org/reverse.php?format=html&lat=43.64529279494597&lon=-79.38523801990962&zoom=18

Знаете... я наверное буду впотёмках лазить, если буду гадать. Поэтому у меня вопрос. Кроме того кода, который вы привели, у ваас в проекте есть ещё что-то в QML части? Я наверное просто взял бы вечером этот кусок кода и попробовалл бы скомпилировать у себя. Так наверное будет лучше.

Ничего там пока нет, но вот сам проект, так будет удобней. mapGeocode.7z mapGeocode.7z Спасибо за участие.

Можно привязать адрес к локации, но пока не понятно как в локацию ввести 4 ограничивающие координаты.

 Location
        {
            id: myLocation
         /*coordinate{
         latitude:  - 27.3
         longitude:  153.1
            }*/
                address:  Address {
                id:  myAddress2
            }
        }

Итак, вот получился рабочий вариант. Что интересно, некоторые параметры плагина, которые вы ввели разбивали работу карты. То есть установки по умолчанию сработали лучше. А вообще запрос адреса по координатам делается через GeocodeModel, Address может быть вспомогательной единицей, если вам нужно будет найти координаты по адресу.

import QtQuick 2.12
import QtQuick.Window 2.12
import QtLocation 5.12
import QtPositioning 5.12

Item {
    visible: true
    width: 480
    height: 720

    property double old : 19
    property double now

    Rectangle
    {
        anchors.fill: parent
        color: "#eee"

        Plugin
        {
            id: plugin
            name: "osm"
            PluginParameter { name: "osm.useragent"; value: "My great Qt OSM application" }
        }

        Map
        {
            id: maps
            anchors.fill: parent
            plugin: plugin
            gesture.enabled: true
            gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture | MapGestureArea.FlickGesture
            gesture.flickDeceleration: 3000
            zoomLevel: 19
            center: QtPositioning.coordinate(59.91, 10.75) // Oslo

            onCenterChanged:
            {
                geocodeModel.query = visibleRegion.center()
                geocodeModel.update()
            }

            minimumZoomLevel: 1

            focus: true

            GeocodeModel {
                id: geocodeModel
                plugin: plugin
                onLocationsChanged:
                {
                    console.log("onLocationsChanged")
                    if (count == 1) {
                        console.log("street:" + geocodeModel.get(0).address.street )
                        console.log("district:" + geocodeModel.get(0).address.district )
                        console.log("city:" + geocodeModel.get(0).address.city )
                        console.log("county:" + geocodeModel.get(0).address.county )
                        console.log("state:" + geocodeModel.get(0).address.state )
                        console.log("countryCode:" + geocodeModel.get(0).address.countryCode )
                        console.log("country:" + geocodeModel.get(0).address.country )
                        console.log("postalCode:" + geocodeModel.get(0).address.postalCode )
                    }
                }
            }
        }
    }
}

Спасибо за помощь. Теория о том, что Address поможет получить номера домов провалилась. Как же получиться номера домов? Может быть обращаться к API сайта OSM и запрашивать json или может быть можно все же получить эти данные у Qt карты?

Может быть можно задавать bounds : geoshape границы GeocodeModel, и уже в пределах этих гранить как то забирать у GeocodeModel координаты объектов и их номера?

Ну вообще нужная информация хранится в поле street, там идёт название улицы и номер дома, если он есть.

то есть возвращается информация здесь

geocodeModel.get(0).address.street

Естественно, что там нет отдельного поля для номера дома. Просто потому, что это карта мира, а каждой стране свои правила нумерации домов. Вот там всё и свалено в одно поля.

Ну как вариант, ещё поле county может содержать то, что вам нужно.

geocodeModel.get(0).address.county

Если говорить об API, то нужно тогда писать класс для запросов на основе QNetworkManager и посылать запрос координат и смотреть, что там вернётся. Но не удивлюсь, если ситуация будет та же самая.

Оказалось номер дома находится в text, вот пример того, что он возвращает:

Золотой Вавилон, 211 к2, проспект Мира, Ростокино, район Ростокино, Северо-Восточный административный округ, Москва, Центральный федеральный округ, 129327, РФ

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

Не думаю, что вообще возможно через GeocodeModel получить координаты и адреса всех домой в заданной области.

Для выполнения запроса в GeocodeModel присутствует свойство query. Вот его описание.

This property holds the data of the geocoding request. The property accepts three types of queries which determine both the data and the type of action to be performed:

  • Address - Geocoding (address to coordinate)
  • coordinate - Reverse geocoding (coordinate to address)
  • string - Geocoding (address to coordinate)

И пример запроса

{
    geocodeModel.query = "53 Brandl St, Eight Mile Plains, Australia"
    geocodeModel.update()
}

Исходя их этого описания, я могу сказать, что по конкретным координатам можно получить только адреса, которые находятся в данных координатах. Такое возможно, когда дом имеет несколько адресов. То есть все адреса в одной точке. При этом нет никакой возможности задать область поиска и получить все адреса по всем координатам.

Однако, вполне возможно, что то, что вы хотите сделать, можно реализовать с помощью PlaceSearchModel. Там можно задать область поиска, так что вполне возможно, что там как-то можно найти то, что требуется.

Подключил PlaceSearchModel и задал область поиска. Скажите пожалуйста, как получить из PlaceSearchModel количество объектов и их координаты?

import QtQuick 2.12
import QtQuick.Window 2.12
import QtLocation 5.12
import QtPositioning 5.12

Item {
    visible: true
    width: 480
    height: 720

    property double old : 19
    property double now

    Rectangle
    {
        anchors.fill: parent
        color: "#eee"

        Plugin
        {
            id: plugin
            name: "osm"
            PluginParameter { name: "osm.useragent"; value: "My great Qt OSM application" }
        }

        Map
        {
            id: maps
            anchors.fill: parent
            plugin: plugin
            gesture.enabled: true
            gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture | MapGestureArea.FlickGesture
            gesture.flickDeceleration: 3000
            zoomLevel: 19
            center: QtPositioning.coordinate(55.845741, 37.660652) // Moscow

            onCenterChanged:
            {
                geocodeModel.query = visibleRegion.center()
                geocodeModel.update()
                mySearchModel.searchArea = visibleRegion.boundingGeoRectangle() //it's work
                mySearchModel.update()
            }

            minimumZoomLevel: 1

            focus: true

            PlaceSearchModel {
                id: mySearchModel
                plugin: plugin
                searchArea: visibleRegion.boundingGeoRectangle()
                onSearchAreaChanged:  //it's work
                {
                    console.log("onSearchAreaChanged :" )
                }
            }

            GeocodeModel {
                id: geocodeModel
                plugin: plugin
                onLocationsChanged:
                {
//                    console.log("onLocationsChanged")
//                    if (count == 1) {
//                        console.log("street:" + geocodeModel.get(0).address.street )
//                        console.log("district:" + geocodeModel.get(0).address.district )
//                        console.log("city:" + geocodeModel.get(0).address.city )
//                        console.log("county:" + geocodeModel.get(0).address.county )
//                        console.log("state:" + geocodeModel.get(0).address.state )
//                        console.log("countryCode:" + geocodeModel.get(0).address.countryCode )
//                        console.log("country:" + geocodeModel.get(0).address.country )
//                        console.log("postalCode:" + geocodeModel.get(0).address.postalCode )
//                        console.log("text:" + geocodeModel.get(0).address.text )
//                        //console.log("bounds:" + geocodeModel.bounds)
//                    }
                }
            }
        }
    }
}

Узнал что число найденых объектов можно узнать так

console.log("count :" + mySearchModel.count)

Но становится вопрос о поиске, пробовал не задавать поиск или задовать так, но все равно ничего не ищет

mySearchModel.searchTerm = ""

Также пробовал вводить в поиск номер дома на экране, тоже ничего не ищет

mySearchModel.searchTerm = "211 к2"

Но по названию магазина находит объект

mySearchModel.searchTerm = "Золотой Вавилон"

По названиям улиц он выводит количество видимых участков дорого:

mySearchModel.searchTerm = "проспект Мира"

По индексу выдает тоже 1 результат, видимо район. Скажите пожалуйста как задать поиск так, что-бы получать все здания?

Я не уверен, что через эту модель вообще можно найти все объекты в области.

Однако по запросу можно найти, что интересует.

Вот на этой странице есть несколько полезных примеров поиска

Спасибо за ссылку. Но там забор информации идет через PlaceSearchModel . Можно ли иначе забрать информацмю или может быть можно иначе задать поиск, чтобы получать в результате все здания?

Может быть как-то можно в PlaceSearchModel задать поис по типу (имею ввиду поиск только по зданиям, улицам)?

Есть свойство: Place.UnspecifiedVisibility , оно должно показывать область видимости для всей недвижимости. Может это можно как то прикрутить? Или может быть можно как-то получить все объекты с карты и прогнать их через Place.UnspecifiedVisibility ?

Попробовал получить хоть что-нибудь из карты, но нечего не выводит:

                console.log("mapParametеrs: " + maps.mapParameters)
                console.log("mapItems: " + maps.mapItems)

Похоже все данные об объектах хранятся в Plugin. Нет ли у вас других идей, как можно достать из плагина все объекты или только нужные объекты?

Честно говоря дальше и глубже в этом вопросе я уже сам теряюсь, учитывая, что не работал с этим плагином. Пока мыслей нет на этот счёт.

Возможно что-то может подсказать само API Open Maps. Плагин QML же его использует.

Похоже остается только 2 варианта: 1. Через каждые 10 метров запрашивать место, научиться отличать дома от не домов, потом определять их координаты и потом выводить на экран. 2. Через API запрашивать информацию о домах. Наверно 2 вариант более адекватный. Но тут сталкнулся с недостатком информации. На форму OSM не обсуждался такой вопрос. В Документации не смог найти, нашел только key = building. Не могли бы Вы глянуть на это API?

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

                    console.log("go")
                    for (var a = visibleRegion.boundingGeoRectangle().topLeft.latitude; a <= visibleRegion.boundingGeoRectangle().topLeft.latitude + visibleRegion.boundingGeoRectangle().width; a += 0.000000000001404)
                    {
                        for (var b = visibleRegion.boundingGeoRectangle().topLeft.longitude; b <= visibleRegion.boundingGeoRectangle().topLeft.longitude + visibleRegion.boundingGeoRectangle().height; b += 0.000000000001404)
                        {
                            //console.log("a: " + a + " b: " + b)
                            //console.log()
                        }
                    }
                    console.log("stop")

Тут нашел немного документации . Получилось сделать такие запросы

https://taginfo.openstreetmap.org/api/4/key/combinations?key=building&bbox=51.249,7.148,51.251,7.152
https://taginfo.openstreetmap.org/api/4/key/similar?key=building&bbox=55.769774,37.625700,55.769339,37.628411
https://taginfo.openstreetmap.org/api/4/search/by_value?query=building&bbox=55.769774,37.625700,55.769339,37.628411
https://taginfo.openstreetmap.org/api/4/key/similar?key=building&bbox=51.249,7.148,51.251,7.152

Что то они выдают, но нет координат домов. Видимо нужно добавить какие-то фильтры или еще что-то

Я открыл, посмотрел, закрыл....

Теоретически, может и возможно выдрать оттуда то, что хотите... но наверное, так и придётся искать...

Тех поддрежка Qt говорит что номера домов включает MapType.PedestrianMap . Подскажите пожалуйста, как можно воспользоваться этим свойством. Пока все, из того, что я пробовал с ним делать не работает.

Вот так получаются номера домов, но остаются водные знаки на экране, может быть Вы знаете, как их убрать

activeMapType: maps.supportedMapTypes[5] //3 ночь

PS: такой запрос возвращает номера домов, но без координат

http://overpass.openstreetmap.fr/api/interpreter?data=[out%3Ajson]%3Bway["building"](55.809007,37.640680,55.809730,37.643153)%3B(._%3B>%3B)%3Bout%3B

Получил Тут ключ, осталось понять, как его использовать.

По ходу, вам нужно получить ключ для API. Обычно регистрируются в сервисе и получают ключ. Там есть регистрация?

Посмотрите в описании запросов для API. Там наверняка нужно просто добавить переменную с ключом

На сайте, где получил ключ написанно следующие:

Это нужно как то указать в плагине . Может быть Вы знаете как? Раньше у меня в коде было написанно так, видимо нужно на это опираться для модификации

//            PluginParameter { name: "osm.useragent"; value: "My great Qt OSM application" }
//            PluginParameter { name: "osm.mapping.host"; value: "http://osm.tile.server.address/" }
//            PluginParameter { name: "osm.mapping.copyright"; value: "All mine" }
//            PluginParameter { name: "osm.routing.host"; value: "http://osrm.server.address/viaroute" }
//            PluginParameter { name: "osm.geocoding.host"; value: "http://geocoding.server.address" }
//            PluginParameter { name: "osm.places.host"; value: "http://geocoding.server.address" }

Делается наверно как то так, но конкретно так не работает

PluginParameter {name: "osm.mapping.apikey" ; value:"мой ключ"}

Для гугла наверно работает так


    Plugin {
        id: googleMaps
        name: "googlemaps" // "mapboxgl", "esri", ...
        // specify plugin parameters if necessary
         PluginParameter {
             name:"googlemaps.maps.apikey"
             value:"*******My Api Key*********"
         }

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

D
Aug. 16, 2019, 11:58 a.m.
Damir

C++ - Тест 003. Условия и циклы

  • Result:92points,
  • Rating points8
D
Aug. 16, 2019, 11:46 a.m.
Damir

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
u
Aug. 14, 2019, 1:55 p.m.
unrealproro

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
Aug. 19, 2019, 6:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
Aug. 18, 2019, 5:09 a.m.
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
Aug. 17, 2019, 8:04 a.m.
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 12:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 11:16 a.m.
Dmitrij

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 21, 2019, 2:16 a.m.
nayk1982

Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант: 1. Получить список таблиц через QSqlDatabase::tables 2. Для каждой табли…
Aug. 21, 2019, 12:31 a.m.
grig_p

Спасибо большое. Я долгое время писал на Object Pascal, привык, что там любое исключение, а не только сгенерированное самостоятельно, может быть перехвачено и обработано в блоках try. Дело …
Aug. 20, 2019, 1:10 p.m.
Mihailll

Нужно будет попробовать подставть другой тип данных, может заработае validator: IntValidator {bottom: 1; top: 99999999999}
Aug. 20, 2019, 12:37 p.m.
Aleksandr Panjushkin

Добрый день. Я бы хотел добавить, что в вашем коде можно было бы использовать слово auto и цикл for с перебором. Так код получился бы компактнее: auto map = new QMap<Qstring, QString&…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB