July 2, 2019, 2: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
                }
            }*/
        }
    }
}

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
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
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

T
Dec. 11, 2019, 4:56 p.m.
Toma

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

  • Result:50points,
  • Rating points-4
AT
Dec. 10, 2019, 8:06 a.m.
Anastasija Troschenkova

C++ - Test 001. The first program and data types

  • Result:60points,
  • Rating points-1
AT
Dec. 10, 2019, 8:02 a.m.
Anastasija Troschenkova

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
Last comments
Dec. 9, 2019, 3:41 a.m.
Evgenij Legotskoj

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
NB
Dec. 9, 2019, 3:36 a.m.
Nikolaj Batmanov

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
Dec. 9, 2019, 3:14 a.m.
Evgenij Legotskoj

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
NB
Dec. 9, 2019, 3:05 a.m.
Nikolaj Batmanov

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
Dec. 8, 2019, 7:23 a.m.
Evgenij Legotskoj

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Now discuss on the forum
Dec. 12, 2019, 11:49 a.m.
qml_puthon_user

Да, с console.log() я разобрался, счётчик ничего не показывает
Dec. 12, 2019, 9:27 a.m.
Evgenij Legotskoj

Добрый день. Вообще Qt Designer это рисовалка формочек. Вы хотите от него больше, чем в нём есть. Максимум, что вы можете сделать, это накидать всю вёрстку в дизайнере, а потом привязыватьс…
MU
Dec. 11, 2019, 8:27 a.m.
Maciej Urmański

Thank you! Now works, and this is solution. num_embed = Embed.objects.filter(added_by=recipe.added_by).count()
Dec. 11, 2019, 8:12 a.m.
Mihailll

Так работает. Взял этот пример https://api-2d3d-cad.com/face_recognition_with_opencv/ void MainWindow::on_pushButton_4_clicked() //фото определение лица{ // Load Face cascade (.xml…
TD
Dec. 10, 2019, 4:14 a.m.
Timur Dosov

Спасибо, работает. А ещё вопрос: как загрузить страницу с динамической подгрузкой контента по скроллингу? Например - [https://ntvplus.ru/tv/]. Пока делаю через костыль - QApplication::s…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB