【问题标题】:Google Map as a Vector Map谷歌地图作为矢量地图
【发布时间】:2014-01-23 07:32:14
【问题描述】:

我已经在每个地方搜索过,我找到的最接近的不是很令人满意 (this),有没有让谷歌地图看起来和表现得像 jvectormap?我所说的行动是指可悬停的国家等,而我所说的外观是指矢量地图具有的干净外观。

【问题讨论】:

  • AFAIK 没有简单的方法可以使用 Google Maps API 实现这一目标。您可以查看developers.google.com/maps/documentation/javascript/styling,它允许您根据需要设置地图样式。要覆盖国家边界,您可以检查 Fusion Tables。下面是一个示例数据集:google.com/fusiontables/… 如果您需要更多关于如何将这一切整合在一起的信息,请告诉我。
  • 根据我的经验,在地图上覆盖世界国家边界可能会非常消耗资源。因此,我强烈建议您将 Fusion Tables 数据导入本地数据库并从那里使用。
  • MrUpsidedown,请提供有关如何将它们组合在一起的任何信息,这似乎是一个可靠的解决方案。

标签: javascript google-maps google-maps-api-3 jvectormap


【解决方案1】:

正如我在评论中所建议的,您可以查看如何设置地图样式

https://developers.google.com/maps/documentation/javascript/styling

这可以帮助您了解它的工作原理,并最终让您构建自己的:

Google Maps Styling Wizard

关于Fusion Tables,一旦找到合适的数据集(有很多,有些不完整,或多或少,几何细节的级别可能因一组而异),您可以将其下载为 CSV,并将其导入您的数据库。从那里,您可以查询您的数据库并为每个国家/地区创建多边形。稍后我将使用一些代码更新我的答案以帮助您入门。

编辑:这是我用于我的一个项目的数据集。也许它可以帮助你。它只包含我感兴趣的字段,但具有与每个国家相关的随机颜色。 http://www.sendspace.com/file/plgku3 https://www.dropbox.com/s/7o5y26gfim1asf0/gmaps_countries.sql?dl=1 https://drive.google.com/file/d/1Qi4TOA3YUh3bL8SuIWbjA0B0QFIrA1ti/view?usp=sharing

编辑 2: 这是 JavaScript

var g = google.maps;
var countries = [];

function jsonCountries() {

    $.ajax({

        url : 'get_countries.php',
        cache : true,
        dataType : 'json',
        async : true,

        success : function(data) {

            if (data) {
                
                $.each(data, function(id,country) {
    
                    var countryCoords;
                    var ca;
                    var co;
                    
                    if ('multi' in country) {
                        
                        var ccArray = [];
                        
                        for (var t in country['xml']['Polygon']) {
                        
                            countryCoords = [];
    
                            co = country['xml']['Polygon'][t]['outerBoundaryIs']['LinearRing']['coordinates'].split(' ');
    
                            for (var i in co) {
                        
                                ca = co[i].split(',');
                        
                                countryCoords.push(new g.LatLng(ca[1], ca[0]));
                            }
                        
                            ccArray.push(countryCoords);
                        }
                        
                        createCountry(ccArray,country);
                        
                    } else {
                        
                        countryCoords = [];
                        
                        co = country['xml']['outerBoundaryIs']['LinearRing']['coordinates'].split(' ');

                        for (var j in co) {
                        
                            ca = co[j].split(',');
                        
                            countryCoords.push(new g.LatLng(ca[1], ca[0]));
                        }
                        
                        createCountry(countryCoords,country);
                    }
                });
                
                toggleCountries();
            }
        }
    });
}

function createCountry(coords, country) {
    
    var currentCountry = new g.Polygon({
        paths: coords,
        strokeColor: 'white',
        strokeOpacity: 1,
        strokeWeight: 1,
        fillColor: country['color'],
        fillOpacity: .6
    });
                    
    countries.push(currentCountry);
}

function toggleCountries() {
    
    for (var i=0; i<countries.length; i++) {
        
        if (countries[i].getMap() !== null) {
            
            countries[i].setMap(null);
            
        } else {
            
            countries[i].setMap(map);
        }
    }
}

这里是 get_countries.php

$results = array();

$sql = "SELECT * from gmaps_countries";
$result = $db->query($sql) or die($db->error);

while ($obj = $result->fetch_object()) {

    $obj->xml = simplexml_load_string($obj->geometry);
    $obj->geometry = '';
    
    foreach ($obj->xml->Polygon as $value) {

        $obj->multi = 'multigeo';
    }
    
    $results[] = $obj;
}

echo json_encode($results);

只需在需要时致电jsonCountries()。希望这会有所帮助!

【讨论】:

  • 请注意,某些国家/地区有多个几何集,因此我使用 PHP 设置了 if ('multi' in country)
  • 只是一个提示:如果你想让它看起来像 jvectormap,你可以使用样式基本上隐藏所有东西(也许除了水),然后覆盖国家。玩得开心!
  • 致今天支持这个答案的人:我用 SQL 文件更新了下载链接; sendspace 链接已失效。
  • 无法查看 style.html 文件。
  • 不确定您指的是哪个链接。我更新了样式向导的链接。 SQL 文件的链接也消失了。我会尽快更新。
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
相关资源
最近更新 更多