WME Data Store

Store objects when panning the map to compile lists for export (i.e. cities, places, segments)

当前为 2014-09-28 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name                WME Data Store
// @author		davielde
// @description         Store objects when panning the map to compile lists for export (i.e. cities, places, segments)
// @include             https://www.waze.com/editor/*
// @include             https://www.waze.com/*/editor/*
// @include             https://editor-beta.waze.com/*
// @version             0.3.1
// @grant               none
// @namespace           https://greasyfork.org/users/5252
// ==/UserScript==


function bootstrapDS()
{
    var bGreasemonkeyServiceDefined = false;
    
    try {
        bGreasemonkeyServiceDefined = (typeof Components.interfaces.gmIGreasemonkeyService === "object");
    }
    catch (err) { /* Ignore */ }
    
    if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
        unsafeWindow    = ( function () {
            var dummyElem = document.createElement('p');
            dummyElem.setAttribute('onclick', 'return window;');
            return dummyElem.onclick();
        }) ();
    }
    
    setTimeout(initializeDS, 999);

}


function getBounds()
{
   	var currentBounds = Waze.map.getExtent();

    currentBounds.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326"));
    //console.log('WME Data Store: Current bounds = Left ' + currentBounds.left + ', Right ' + currentBounds.right + ', Bottom ' + currentBounds.bottom + ', Top ' + currentBounds.top);//verify transform
    
    return currentBounds;
}


function getWMEData(){
    
    var locale = I18n.locale;
    var zoom = Waze.map.zoom;
    var cityLabel = I18n.translations[locale].layers.name["cities"];
    var venueLabel = I18n.translations[locale].layers.name["landmarks"];
    var segmentLabel = I18n.translations[locale].layers.name["segments"];
    
    var currentBounds = getBounds();
    var center900913 = Waze.map.getCenter();
    var center4326 = center900913.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326"));
    
    console.log('WME Data Store: new execution');
    
    var cityData = ['CountryID','Country','StateID','State','CityID'
                    ,'CityName','CityEnglishName','IsEmpty','NearLongitude','NearLatitude'
                   ];
    try{
        var currentCities = Waze.model.cities.additionalInfo;
        for(i=0; i<currentCities.length; i++)
      	{
            var stateObj = Waze.model.states.get(currentCities[i].stateID);
            var stateName = stateObj.name.replace(/,/g, '.');
            var countryObj = Waze.model.countries.get(currentCities[i].countryID);
            var countryName = countryObj.name.replace(/,/g, '.');
            
            //console.log('WME Data Store: countryID = ' + currentCities[i].countryID + ', stateID = ' + currentCities[i].stateID 
            //            + ', cityID = ' + currentCities[i].id + ', city name = ' + currentCities[i].name 
            //            + ', city english name = ' + currentCities[i].englishName + ', isEmpty = ' + currentCities[i].isEmpty);
            cityData.push('\n'+currentCities[i].countryID,countryName,currentCities[i].stateID,stateName
                          ,currentCities[i].id,currentCities[i].name,currentCities[i].englishName,currentCities[i].isEmpty,center4326);
      	} 
    }
    catch(e){
        console.log('WME Data Store: unable to process city list, ' + e);
    }  
    
    //console.log('WME Data Store: ' + cityData);
    
    
    var venueData = ['FID','PlaceName','Brand','Lock','PrimaryCategory','Type'
                     ,'CreateDateTime','CreatedByName','UpdateDateTime'
                    ];
    try{
        var currentVenues = Waze.model.venues.additionalInfo;
        for(i=0; i<currentVenues.length; i++)
      	{
            var venueFID = currentVenues[i].fid;
            var venueName = currentVenues[i].attributes.name.replace(/,/g, '.');
            if(currentVenues[i].geometry.CLASS_NAME == 'OpenLayers.Geometry.Point'){var venueType = 'Point'}else{var venueType = 'Area'}
            var venueLockRank = currentVenues[i].attributes.lockRank + 1;
            var venueBrand = currentVenues[i].attributes.brand;
            var venueCreatedOn = new Date(parseInt(currentVenues[i].attributes.createdOn));
            var venueCreatedByUserObj = Waze.model.users.get(currentVenues[i].attributes.createdBy);
            var venueCreatedByName = venueCreatedByUserObj.name;
            var venueUpdatedOn = ((currentVenues[i].attributes.updatedOn == null) ? "" : new Date(parseInt(currentVenues[i].attributes.updatedOn)));
            
            venueData.push('\n'+venueFID,venueName,venueBrand,venueLockRank,currentVenues[i].attributes.categories[0],venueType
                           ,venueCreatedOn,venueCreatedByName,venueUpdatedOn
                          );
      	} 
    }
    catch(e){
        console.log('WME Data Store: unable to process venue list, ' + e);
    }  
    
    //if(zoom >= 4){
        var segmentData = ['SegmentID','CountryName','StateName','CityName','PrimaryStreetName','RoadType','RoadTypeName'
                           ,'FwdToll','ReverseToll','FwdDirection','ReverseDirection','Elevation','Rank','LengthInMeters'
                           ,'CreateDateTime','CreatedByName','CreatedByRank','UpdateDateTime','UpdatedByName','UpdatedByRank'
                          ];
        try{
            var currentSegments = Waze.model.segments.additionalInfo;
            //var lastSegUpdate = Math.max.apply(Math,currentSegments.map(function(o){return parseInt(o.attributes.updatedOn);}));
            //var lastSegUpdateDateTime = new Date(lastSegUpdate);
            //console.log('WME Data Store: max test = ' + lastSegUpdateDateTime);
            for(i=0; i<currentSegments.length; i++)
            {
                var segmentID = currentSegments[i].fid;
                var primaryStreetObj = Waze.model.streets.get(currentSegments[i].attributes.primaryStreetID);
                var primaryStreetName = primaryStreetObj.name.replace(/,/g, '.');
                var segCityObj = Waze.model.cities.get(primaryStreetObj.cityID);
                var segCityName = segCityObj.name.replace(/,/g, '.');
                var segStateObj = Waze.model.states.get(segCityObj.stateID);
                var segStateName = segStateObj.name.replace(/,/g, '.');
                var segCountryObj = Waze.model.countries.get(segCityObj.countryID);
                var segCountryName = segCountryObj.name.replace(/,/g, '.');
                var segRoadType = currentSegments[i].attributes.roadType;
                var segRoadTypeName = I18n.translations[locale].segment.road_types[segRoadType];
                var segCreatedOn = new Date(parseInt(currentSegments[i].attributes.createdOn));
                var segCreatedByUserObj = Waze.model.users.get(currentSegments[i].attributes.createdBy);
                var segCreatedByName = segCreatedByUserObj.userName.replace(/,/g, '.');
                var segCreatedByRank = segCreatedByUserObj.rank + 1;
                var segUpdatedOn = ((currentSegments[i].attributes.updatedOn == null) ? "" : new Date(parseInt(currentSegments[i].attributes.updatedOn))); //segments with no updates will throw errors
                var segUpdatedByUserObj = ((currentSegments[i].attributes.updatedOn == null) ? "" : Waze.model.users.get(currentSegments[i].attributes.updatedBy));
                var segUpdatedByName = ((currentSegments[i].attributes.updatedOn == null) ? "" : segUpdatedByUserObj.userName.replace(/,/g, '.'));
                var segUpdatedByRank = ((currentSegments[i].attributes.updatedOn == null) ? "" : segUpdatedByUserObj.rank + 1);
                var segFwdToll = currentSegments[i].attributes.fwdToll;
                var segRevToll = currentSegments[i].attributes.revToll;
                var segFwdDirection = currentSegments[i].attributes.fwdDirection;
                var segRevDirection = currentSegments[i].attributes.revDirection;
                var segElevation = currentSegments[i].attributes.level;
                var segRank = currentSegments[i].attributes.lockRank + 1;
                var segLength = currentSegments[i].attributes.length;
    
                segmentData.push('\n'+segmentID,segCountryName,segStateName,segCityName,primaryStreetName,segRoadType,segRoadTypeName
                                 ,segFwdToll,segRevToll,segFwdDirection,segRevDirection,segElevation,segRank,segLength
                                 ,segCreatedOn,segCreatedByName,segCreatedByRank,segUpdatedOn,segUpdatedByName,segUpdatedByRank);
            } 
        }
        catch(e){
            console.log('WME Data Store: unable to process segment list, ' + e);
        }  
    //}
    
    //console.log('WME Data Store: ' + segmentData);

    //Export div
    divJDS = document.createElement('div');
    divJDS.id = 'divJDS';
    divJDS.style.position = 'absolute';
    divJDS.style.bottom = '45px';
    divJDS.style.left = '425px';
    divJDS.style.text = 'white';
    divJDS.style.backgroundColor = 'transparent';
    divJDS.style.borderWidth = '2px';
    divJDS.style.borderStyle = 'groove';
    divJDS.style.boxShadow = '1px 1px 1px Grey';
    divJDS.style.padding = '1px';
    divJDS.style.color = '#F8F8F8';
    divJDS.innerHTML = 'Export ';
    document.body.appendChild(divJDS);
    
	//Export Cities link
    var a = divJDS.appendChild(
        document.createElement('a')
    );
    a.id = 'divJDS_' + cityLabel + '_' + currentBounds.left + '_' + currentBounds.top + '_' + currentBounds.right + '_' + currentBounds.bottom;
    a.download = cityLabel + '_' + currentBounds.left + '_' + currentBounds.top + '_' + currentBounds.right + '_' + currentBounds.bottom + '.csv';
    a.href = 'data:text/csv;base64,' + btoa(cityData);
    a.style.color = '#F8F8F8';
    a.innerHTML = cityLabel + ' ';
    
    //Export Places link
    var a = divJDS.appendChild(
        document.createElement('a')
    );
    a.id = 'divJDS_' + venueLabel + '_' + currentBounds.left + '_' + currentBounds.top + '_' + currentBounds.right + '_' + currentBounds.bottom;
    a.download = venueLabel + '_' + currentBounds.left + '_' + currentBounds.top + '_' + currentBounds.right + '_' + currentBounds.bottom + '.csv';
    a.href = 'data:text/csv;base64,' + btoa(venueData);
    a.style.color = '#F8F8F8';
    a.innerHTML = venueLabel + ' ';
    
    //Export Segments link
    var a = divJDS.appendChild(
        document.createElement('a')
    );
    a.id = 'divJDS_' + segmentLabel + '_' + currentBounds.left + '_' + currentBounds.top + '_' + currentBounds.right + '_' + currentBounds.bottom;
    a.download = segmentLabel + '_' + currentBounds.left + '_' + currentBounds.top + '_' + currentBounds.right + '_' + currentBounds.bottom + '.csv';
    a.href = 'data:text/csv;base64,' + btoa(segmentData);
    a.style.color = '#F8F8F8';
    a.innerHTML = segmentLabel + ' ';

}


function initializeDS()
{    
    
    //Waze.map.events.register("mergeend", Waze.map, getWMEData());
    Waze.map.events.register("moveend", Waze.map, getWMEData());
    //Waze.map.events.register("zoomend", Waze.map, getWMEData());
     
}

bootstrapDS();