在地图上的矩形上均匀分布点(调试)

时间:2017-06-19 18:45:23

标签: php debugging dictionary leaflet

我想通过生成纬度和经度在地图上平均分配N个点。我是一个基于传单的网络地图,用于显示没有地理代表的功能。

点应位于Tchad顶部的灰色矩形中(对不起Tchad)。

enter image description here

不幸的是,这些标记最终出错了。

我有以下代码,我确信我在某处混合纬度和经度,但找不到位置。

(PS:我认为最终的代码对任何想要完成相同任务的人都很有用 - 只需在矩形中分配点数)

这是我的功能:

function distribute_points()
{
    $articles = get_posts(
        array(
            'numberposts' => -1,
            'post_status' => 'any',
            'lang' => 'en',
        )
    );

    // consts
    $colsToRowsFactor = 5;
    $minLat = 23.40; // x
    $minLon = 16.8;  // y
    $maxLat = 4.8;
    $maxLon = 20.9;

    $lonRange = $maxLon - $minLon;
    $latRange = $maxLat - $minLat;

    $count = count($articles);

    $cols = ceil( sqrt($count / $colsToRowsFactor));

    $maxRows = ceil($count / $cols);

    $lonIncrement = $lonRange / $cols;
    $latIncrement = $latRange / $maxRows;
    $i = 0;

    $lat = $minLat;
    $lon = $minLon;
    foreach ($articles as $article) {
        $i++;
        echo $article->ID . ' ' . $article->post_title . ' ' . $lat . ' ' . $lon . PHP_EOL; //...


        $lat += $latIncrement;

        if ($i % $maxRows == 0) {
            $lat = $minLat;
            $lon += $lonIncrement;
            echo '---------' . PHP_EOL;
        }

        $field_obj = get_field_object(
            'location',
            $article->ID,
            array(
                'load_value' => true
            )
        );

        $value = $this->makeGeoJson( $lat, $lon );

        update_field('location', $value, $article->ID);
    }

}

不太重要

    /**
     * @param $lat
     * @param $lon
     *
     * @return string
     */
    protected function makeGeoJson( $lat, $lon ) {
        return <<<JSON
{  
   "zoom_level":0,
   "center":{  
      "lat":59.83598558292964,
      "lng":-154.68749999999997
   },
   "markers":{  
      "m_31":{  
     "type":"Feature",
     "properties":{  
        "popupContent":""
     },
     "geometry":{  
        "type":"Point",
        "coordinates":[  
           $lat,
           $lon
        ]
     },
     "id":31
      }
   },
   "bounds":null,
   "initial_bounds":{  
      "_southWest":{  
     "lat":2.39,
     "lng":-25.73
      },
      "_northEast":{  
     "lat":24.93,
     "lng":16.1
      }
   },
   "drawnItems":{"type":"FeatureCollection","features":[]}

}
JSON;
    }

}

更新:在地理Json的工作中切换lat和lon,但为什么呢?我以为GeoJSON使用lat,lon order?

function distribute_points()
{
    $articles = get_posts(
        array(
            'numberposts' => -1,
            'post_status' => 'any',
            'lang' => 'en',
        )
    );

    // consts
    $colsToRowsFactor = 5;
    $minLat = 23.40; // x
    $minLon = 16.8;  // y
    $maxLat = 4.8;
    $maxLon = 20.9;

    $lonRange = $maxLon - $minLon;
    $latRange = $maxLat - $minLat;

    $count = count($articles);

    $cols = ceil( sqrt($count / $colsToRowsFactor));

    $maxRows = ceil($count / $cols);

    $lonIncrement = $lonRange / $cols;
    $latIncrement = $latRange / $maxRows;

    $minLat += ($latIncrement / 2);
    $lat = $minLat;
    $lon = $minLon;

    $i = 0;
    foreach ($articles as $article) {
        echo $article->ID . ' ' . $article->post_title . ' ' . $lat . ' ' . $lon . PHP_EOL; //...

        if ($i != 0 && $i % $maxRows == 0) {
            $lat = $minLat;
            $lon += $lonIncrement;
            echo '---------' . PHP_EOL;
        } else {
            $lat += $latIncrement;
        }

        $value = $this->makeGeoJson( $lon, $lat ); // switched lon and lat works, but why?

        update_field('location', $value, $article->ID);

        $i++;

    }

}

1 个答案:

答案 0 :(得分:3)

GeoJSON似乎使用[经度,纬度,高程]顺序。这就是为什么它在您切换纬度和经度时起作用。
以下来自this网站。

位置

position是一个按顺序排列的坐标数组:这是我们可以真正认为是“一个地方”的最小单位,因为它可以代表地球上的一个点。 GeoJSON描述了坐标的顺序:它们应按顺序排列:

[longitude, latitude, elevation]

这个订单可能令人惊讶。从历史上看,坐标的顺序通常是“纬度,经度”,许多人会认为这是普遍存在的情况。浪费了很长时间讨论哪个更好,但对于这个讨论,我将总结如下:

  • 经度,纬度匹配数学的X,Y顺序
  • 数据格式通常使用经度,纬度顺序
  • 应用程序倾向于使用纬度,经度顺序

这是handy chart of what uses which ordering.