void GosmoreRunner::reverseGeocoding( const GeoDataCoordinates &coordinates ) { if ( !d->m_gosmoreMapFile.exists() ) { emit reverseGeocodingFinished( coordinates, GeoDataPlacemark() ); return; } QString queryString = "flat=%1&flon=%2&tlat=%1&tlon=%2&fastest=1&v=motorcar"; double lon = coordinates.longitude( GeoDataCoordinates::Degree ); double lat = coordinates.latitude( GeoDataCoordinates::Degree ); queryString = queryString.arg( lat, 0, 'f', 8).arg(lon, 0, 'f', 8 ); QByteArray output = d->retrieveWaypoints( queryString ); GeoDataPlacemark placemark; placemark.setCoordinate( coordinates ); QStringList lines = QString::fromUtf8( output ).split( '\r' ); if ( lines.size() > 2 ) { QStringList fields = lines.at( lines.size()-2 ).split(','); if ( fields.size() >= 5 ) { QString road = fields.last().trimmed(); placemark.setAddress( road ); GeoDataExtendedData extendedData; extendedData.addValue( GeoDataData( "road", road ) ); placemark.setExtendedData( extendedData ); } } emit reverseGeocodingFinished( coordinates, placemark ); }
void OsmNominatimRunner::addData( const QDomNodeList &node, const QString &key, GeoDataExtendedData *extendedData ) { QDomNodeList child = node.item( 0 ).toElement().elementsByTagName( key ); if ( child.size() > 0 ) { QString text = child.item( 0 ).toElement().text(); extendedData->addValue( GeoDataData( key, text ) ); } }
GeoDataExtendedData OsmNominatimRunner::extractChildren(const QDomNode &node) { GeoDataExtendedData data; QDomNodeList nodes = node.childNodes(); for (int i=0, n=nodes.length(); i<n; ++i) { QDomNode child = nodes.item(i); data.addValue( GeoDataData( child.nodeName(), child.toElement().text() ) ); } return data; }
const OsmPlacemarkData& GeoDataPlacemark::osmData() const { QVariant &placemarkVariantData = extendedData().valueRef( OsmPlacemarkData::osmHashKey() ).valueRef(); if ( !placemarkVariantData.canConvert<OsmPlacemarkData>() ) { extendedData().addValue( GeoDataData( OsmPlacemarkData::osmHashKey(), QVariant::fromValue( OsmPlacemarkData() ) ) ); placemarkVariantData = extendedData().valueRef( OsmPlacemarkData::osmHashKey() ).valueRef(); } OsmPlacemarkData &osmData = *reinterpret_cast<OsmPlacemarkData*>( placemarkVariantData.data() ); return osmData; }
OsmRelationEditorDialog::OsmRelationEditorDialog( OsmPlacemarkData *relationData, QWidget *parent ) : QDialog( parent ) { m_relationData = relationData; QVBoxLayout *layout = new QVBoxLayout( this ); // Name input area QHBoxLayout *nameLayout = new QHBoxLayout(); QLabel *nameLabel = new QLabel( tr( "Name" ), this ); m_nameLineEdit = new QLineEdit( this ); m_nameLineEdit->setText(relationData->tagValue(QStringLiteral("name"))); nameLayout->addWidget( nameLabel ); nameLayout->addWidget( m_nameLineEdit ); layout->addLayout( nameLayout ); // Tag editor area // A dummy placemark is needed because the OsmTagEditorWidget works with placemarks m_dummyPlacemark = new GeoDataPlacemark(); // "osmRelaation=yes" entry is added to its ExtendedData to let the widget know // its special relation status GeoDataExtendedData extendedData; extendedData.addValue(GeoDataData(QStringLiteral("osmRelation"), QStringLiteral("yes"))); m_dummyPlacemark->setExtendedData( extendedData ); m_dummyPlacemark->setOsmData( *m_relationData ); OsmObjectManager::initializeOsmData( m_dummyPlacemark ); m_tagEditor = new OsmTagEditorWidget( m_dummyPlacemark, this ); layout->addWidget( m_tagEditor ); // Button box area m_buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this ); layout->addWidget( m_buttonBox ); QObject::connect( m_buttonBox, SIGNAL( accepted() ), this, SLOT( checkFields() ) ); connect(m_buttonBox, SIGNAL(rejected()), SLOT(reject())); }
void GeoDataPlacemark::setOsmData( const OsmPlacemarkData &osmData ) { extendedData().addValue( GeoDataData( OsmPlacemarkData::osmHashKey(), QVariant::fromValue( osmData ) ) ); }
void OsmNominatimRunner::handleResult( QNetworkReply* reply ) { QDomDocument xml; if (!xml.setContent(reply->readAll())) { qWarning() << "Cannot parse osm nominatim result"; qWarning() << reply->error(); returnNoResults(); return; } QVector<GeoDataPlacemark*> placemarks; QDomElement root = xml.documentElement(); QDomNodeList places = root.elementsByTagName(QStringLiteral("place")); for (int i=0; i<places.size(); ++i) { QDomNode place = places.at(i); QDomNamedNodeMap attributes = place.attributes(); QString lon = attributes.namedItem(QStringLiteral("lon")).nodeValue(); QString lat = attributes.namedItem(QStringLiteral("lat")).nodeValue(); QString desc = attributes.namedItem(QStringLiteral("display_name")).nodeValue(); QString key = attributes.namedItem(QStringLiteral("class")).nodeValue(); QString value = attributes.namedItem(QStringLiteral("type")).nodeValue(); OsmPlacemarkData data; GeoDataExtendedData placemarkData = extractChildren(place); placemarkData.addValue(GeoDataData(QStringLiteral("class"), key)); placemarkData.addValue(GeoDataData(QStringLiteral("type"), value)); QString name = place.firstChildElement(value).text(); QString road = place.firstChildElement(QStringLiteral("road")).text(); placemarkData.addValue(GeoDataData(QStringLiteral("name"), name)); QString city = place.firstChildElement(QStringLiteral("city")).text(); if( city.isEmpty() ) { city = place.firstChildElement(QStringLiteral("town")).text(); if( city.isEmpty() ) { city = place.firstChildElement(QStringLiteral("village")).text(); } if( city.isEmpty() ) { city = place.firstChildElement(QStringLiteral("hamlet")).text(); } } QString administrative = place.firstChildElement(QStringLiteral("county")).text(); if( administrative.isEmpty() ) { administrative = place.firstChildElement(QStringLiteral("region")).text(); if( administrative.isEmpty() ) { administrative = place.firstChildElement(QStringLiteral("state")).text(); data.addTag(QStringLiteral("addr:state"), administrative); } else { data.addTag(QStringLiteral("district"), administrative); } } QString country = place.firstChildElement(QStringLiteral("country")).text(); QString description; for (int i=0; i<place.childNodes().size(); ++i) { QDomElement item = place.childNodes().at(i).toElement(); description += item.nodeName() + QLatin1Char(':') + item.text() + QLatin1Char('\n'); } description += QLatin1String("Category: ") + key + QLatin1Char('/') + value; if (!lon.isEmpty() && !lat.isEmpty() && !desc.isEmpty()) { QString placemarkName; GeoDataPlacemark* placemark = new GeoDataPlacemark; // try to provide 2 fields if (!name.isEmpty()) { placemarkName = name; } if (!road.isEmpty() && road != placemarkName ) { if( !placemarkName.isEmpty() ) { placemarkName += QLatin1String(", "); } placemarkName += road; data.addTag(QStringLiteral("addr:street"), road); } if (!city.isEmpty() && !placemarkName.contains(QLatin1Char(',')) && city != placemarkName) { if( !placemarkName.isEmpty() ) { placemarkName += QLatin1String(", "); } placemarkName += city; data.addTag(QStringLiteral("addr:city"), city); } if (!administrative.isEmpty() && !placemarkName.contains(QLatin1Char(',')) && administrative != placemarkName) { if( !placemarkName.isEmpty() ) { placemarkName += QLatin1String(", "); } placemarkName += administrative; } if (!country.isEmpty() && !placemarkName.contains(QLatin1Char(',')) && country != placemarkName) { if( !placemarkName.isEmpty() ) { placemarkName += QLatin1String(", "); } placemarkName += country; data.addTag(QStringLiteral("addr:country"), country); } if (placemarkName.isEmpty()) { placemarkName = desc; } placemark->setName( placemarkName ); placemark->setDescription(description); placemark->setAddress(desc); placemark->setCoordinate( lon.toDouble(), lat.toDouble(), 0, GeoDataCoordinates::Degree ); const auto category = StyleBuilder::determineVisualCategory(data); placemark->setVisualCategory( category ); placemark->setExtendedData(placemarkData); placemark->setOsmData(data); placemarks << placemark; } } emit searchFinished( placemarks ); }