Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以使用相同的样式函数设置不同的GeoJSON层的样式吗?_Javascript_Leaflet_Gis_Geojson - Fatal编程技术网

Javascript 我可以使用相同的样式函数设置不同的GeoJSON层的样式吗?

Javascript 我可以使用相同的样式函数设置不同的GeoJSON层的样式吗?,javascript,leaflet,gis,geojson,Javascript,Leaflet,Gis,Geojson,我不熟悉传单和JavaScript。我想知道我是否可以用一种更简洁的方式来编码我的传单地图 我的地图包括三个不同颜色的GeoJSON图层。我通过为每个层调用单独的样式函数来设置颜色。函数“style”返回蓝色,函数“style2”返回紫色,函数“style3”返回粉色。我告诉第1层使用“样式”,第2层使用“样式2”,等等 地图如下: 我可以做同样的事情,但有一个风格的功能?基本上,style函数是否可以检测到图层并执行以下操作: if the layer is layer 1, style li

我不熟悉传单和JavaScript。我想知道我是否可以用一种更简洁的方式来编码我的传单地图

我的地图包括三个不同颜色的GeoJSON图层。我通过为每个层调用单独的样式函数来设置颜色。函数“style”返回蓝色,函数“style2”返回紫色,函数“style3”返回粉色。我告诉第1层使用“样式”,第2层使用“样式2”,等等

地图如下:

我可以做同样的事情,但有一个风格的功能?基本上,style函数是否可以检测到图层并执行以下操作:

if the layer is layer 1, style like this______
if the layer is layer 2, style like this______
if the layer is layer 3, style like this______
如果可以,我将如何用代码编写它

我经常想对几个层使用一个函数,例如设置弹出内容,但我不知道如何根据单击的层使函数的行为有所不同。我只知道如何编写类似但独立的函数并分别调用它们

<div id="map" style="width:800px; height: 600px"></div>
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script src="http://talia.droppages.com/slccommcounc.js"></script>
<script src="http://talia.droppages.com/tract158slc.js"></script>
<script src="http://talia.droppages.com/slccouncil.js"></script>
<script>
var map = L.map('map').setView([40.8, -111.928], 11); 


    L.tileLayer('http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', {
  maxZoom: 18,
  minZoom: 7
  }
  ).addTo(map); 

function style(feature) {
    return {
        weight: 1,
        opacity: 1,
        color: 'blue',
        fillColor: 'cornflowerblue',
        fillOpacity: 0.5
    };
}
function style2(feature) {
    return {
        weight: 1,
        opacity: 1,
        color: 'blueviolet',
        fillColor: 'plum',
        fillOpacity: 0.5
    };
}
function style3(feature) {
    return {
        weight: 1,
        opacity: 1,
        color: 'fuchsia',
        fillColor: 'pink',
        fillOpacity: 0.5
    };
}

var layer1 = new L.geoJson(slccommcounc, {
    style: style,
}).addTo(map);

var layer2 = new L.geoJson(tract158slc, {
    style: style2,
})

var layer3 = new L.geoJson(slccouncil, {
    style: style3,
})

L.control.layers(null,{'Layer 1 Title':layer1,'Layer 3 Title':layer3,'Layer 2 Title':layer2},{collapsed:false}).addTo(map);

</script>

var map=L.map('map').setView([40.8,-111.928],11);
L.tileLayer('http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z} /{y}/{x}'{
maxZoom:18,
最小缩放:7
}
).addTo(地图);
功能样式(特征){
返回{
体重:1,
不透明度:1,
颜色:“蓝色”,
fillColor:‘矢车菊蓝’,
填充不透明度:0.5
};
}
函数样式2(特性){
返回{
体重:1,
不透明度:1,
颜色:'蓝紫色',
fillColor:‘李子’,
填充不透明度:0.5
};
}
函数样式3(特性){
返回{
体重:1,
不透明度:1,
颜色:“紫红色”,
fillColor:'粉红色',
填充不透明度:0.5
};
}
var layer1=新的L.geoJson(SLCCOMMCONC{
风格:风格,
}).addTo(地图);
var layer2=新的L.geoJson(tract158slc{
风格:风格2,
})
var layer3=新的L.geoJson(SLCCOUNCEL{
风格:风格3,
})
层(null,{'Layer 1 Title':layer1,'Layer 3 Title':layer3,'Layer 2 Title':layer2},{折叠:false}).addTo(映射);

我想这就是你要找的。虽然不是最干净的,但它很管用

    function style(opt) {
        switch (opt) {
            case 's1':
                color = 'red';
                fillColor = 'cornflowerblue';
                break;
            case 's2':
                color = 'blueviolet';
                fillColor = 'plum';
                break;
            case 's3':
                color = 'fuchsia'
                fillColor = 'pink'
                break;
        }


    return {
            weight: 1,
            opacity: 1,
            color: color,
            fillColor: fillColor,
            fillOpacity: 0.5
        };
}

var layer1 = new L.geoJson(slccommcounc, {
    style: style('s1'),
}).addTo(map);

var layer2 = new L.geoJson(tract158slc, {
    style: style('s2'),
})

var layer3 = new L.geoJson(slccouncil, {
    style: style('s3'),
})

我发现了一种策略,允许使用一种样式的功能,而不是三种样式的功能。我只需要学习如何将参数传递到style函数中。在这种情况下,唯一的更改是颜色和填充颜色,因此这些参数是在制作图层时设置的。结果贴图看起来与原始贴图完全相同。下面是更简洁的代码:

<div id="map" style="width:800px; height: 600px"></div>
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script src="slccommcounc.js"></script>
<script src="tract158slc.js"></script>
<script src="slccouncil.js"></script>
<script>
var map = L.map('map').setView([40.8, -111.928], 11); 

L.tileLayer('http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', {
  maxZoom: 18,
  minZoom: 7
  }
  ).addTo(map); 

function style(feature) {
    return {
        weight: 1,
        opacity: 1,
        color: color,
        fillColor: fillColor,
        fillOpacity: 0.5
    };
}

var layer1 = new L.geoJson(slccommcounc, {
    style: style(color= 'blue', fillColor = 'cornflowerblue'),
}).addTo(map);

var layer2 = new L.geoJson(tract158slc, {
    style: style(color= 'blueviolet', fillColor = 'plum'),
})

var layer3 = new L.geoJson(slccouncil, {
    style: style(color= 'fuchsia', fillColor = 'pink'),
})

L.control.layers(null,{'Layer 1 Title':layer1,'Layer 3 Title':layer3,'Layer 2 Title':layer2},{collapsed:false}).addTo(map);

</script>

var map=L.map('map').setView([40.8,-111.928],11);
L.tileLayer('http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z} /{y}/{x}'{
maxZoom:18,
最小缩放:7
}
).addTo(地图);
功能样式(特征){
返回{
体重:1,
不透明度:1,
颜色:颜色,
fillColor:fillColor,
填充不透明度:0.5
};
}
var layer1=新的L.geoJson(SLCCOMMCONC{
样式:样式(颜色为“蓝色”,填充颜色为“矢车菊蓝色”),
}).addTo(地图);
var layer2=新的L.geoJson(tract158slc{
样式:样式(颜色为“蓝紫色”,填充颜色为“梅花”),
})
var layer3=新的L.geoJson(SLCCOUNCEL{
风格:风格(颜色=紫红色,填充颜色=粉红色),
})
层(null,{'Layer 1 Title':layer1,'Layer 3 Title':layer3,'Layer 2 Title':layer2},{折叠:false}).addTo(映射);
在我的例子中,我没有基于任何特定属性为图层着色。请注意,如果要根据GeoJson中已设置的特性设置图层样式,请参见以下示例:

最好指定为什么要为此使用一个函数:指定三种不同的样式。即使是最简洁的函数也只能在这三个函数之间进行选择——这比使用三个函数更复杂,也不那么简单。@tmcw我明白你的意思——一个函数仍然会分解成几个部分。我询问一个函数的原因是为了在以后的场景中简洁起见,在地图中添加了更多的图层。例:也许我有10层,我想有完全相同的风格属性,除了“颜色”属性。在“颜色”属性点为每个层指定颜色,而不是重复该功能和所有设置10次,似乎没有那么多余。我很想知道这是否可能,以及如何用传单编码。